将整个文件复制到内存而不是进行多个磁盘访问

时间:2015-04-05 08:50:39

标签: java android encryption file-io

我正在编写一个java程序,我正在加密和解密文件。我将文件视为基本字节数组 - 取N个字节,加密并写入新文件,重复。同样在解密时。

为此,我目前正在将整个文件复制到一个字节数组中:

byte[] fileAsBytes = Files.readAllBytes(Paths.get(pathToFile))

但是随着文件越来越大,我的堆空间也用完了。 (我知道我可以增加JVM的可用内存,但这只会避免这个问题。而且我还必须在Android手机上运行它,内存更加有限。)

所以,我考虑一次只从磁盘读取N个字节,而不是复制所有字节,然后从内存中读取它们。

我的问题是 - 最好的方法是什么?我不需要随机访问,因为我将按顺序读取文件。另外,我看到了多少减速?因为根据我的研究,硬盘访问比内存访问慢得多。

2 个答案:

答案 0 :(得分:3)

你没有任何选择,所以'减速'不是一个考虑因素。你必须以一口大小的块来做。一次说64k。你甚至可能发现它更快。

答案 1 :(得分:0)

最简单的方法是使用CipherInputStreamCipherOutputStream类。这些课程负责缓冲或“零碎”加密。它们不一定完美取决于你想做什么。如果他们缺乏,那么你可以自己管理缓冲。 Cipher类当然充满了方便的块加密/解密方法。