将整个文件复制到内存与进行多个磁盘访问
Copying whole file to memory vs. doing multiple disk accesses
我正在编写一个 java 程序来加密和解密文件。我将这些文件基本上视为字节数组 - 获取 N 个字节,加密并写入新文件,重复。解密时也是如此。
为此,我目前正在将整个文件复制到一个字节数组中:
byte[] fileAsBytes = Files.readAllBytes(Paths.get(pathToFile))
但是对于更大的文件,我 运行 超出了堆 space。 (我知道我可以增加 JVM 的可用内存,但这只是在回避这个问题。另外,我还必须 运行 在内存更有限的 Android 手机上这样做。
所以,我正在考虑一次只从磁盘读取 N 个字节,而不是复制所有字节然后从内存中读取它们。
我的问题是 - 最好的方法是什么?我不需要随机访问,因为我将按顺序读取文件。另外,我看到了多少放缓?因为根据我的研究,硬盘访问比内存访问慢得多。
您别无选择,因此 'slowdown' 不在考虑之列。你必须以一口大小的块来做。一次说64k。您甚至可能会发现它更快。
最简单的方法是使用 CipherInputStream and CipherOutputStream classes. These classes take care of the buffering, or 'piecemeal' encrypting, aspects for you. They aren't necessarily perfect depending on what you want to do. If they are lacking then you can manage the buffering yourself. The Cipher class 当然,在方便的块中提供了 encrypt/decrypt 的方法。
我正在编写一个 java 程序来加密和解密文件。我将这些文件基本上视为字节数组 - 获取 N 个字节,加密并写入新文件,重复。解密时也是如此。
为此,我目前正在将整个文件复制到一个字节数组中:
byte[] fileAsBytes = Files.readAllBytes(Paths.get(pathToFile))
但是对于更大的文件,我 运行 超出了堆 space。 (我知道我可以增加 JVM 的可用内存,但这只是在回避这个问题。另外,我还必须 运行 在内存更有限的 Android 手机上这样做。
所以,我正在考虑一次只从磁盘读取 N 个字节,而不是复制所有字节然后从内存中读取它们。
我的问题是 - 最好的方法是什么?我不需要随机访问,因为我将按顺序读取文件。另外,我看到了多少放缓?因为根据我的研究,硬盘访问比内存访问慢得多。
您别无选择,因此 'slowdown' 不在考虑之列。你必须以一口大小的块来做。一次说64k。您甚至可能会发现它更快。
最简单的方法是使用 CipherInputStream and CipherOutputStream classes. These classes take care of the buffering, or 'piecemeal' encrypting, aspects for you. They aren't necessarily perfect depending on what you want to do. If they are lacking then you can manage the buffering yourself. The Cipher class 当然,在方便的块中提供了 encrypt/decrypt 的方法。