我正在编写一个java程序,我正在加密和解密文件。我将文件视为基本字节数组 - 取N个字节,加密并写入新文件,重复。同样在解密时。
为此,我目前正在将整个文件复制到一个字节数组中:
byte[] fileAsBytes = Files.readAllBytes(Paths.get(pathToFile))
但是随着文件越来越大,我的堆空间也用完了。 (我知道我可以增加JVM的可用内存,但这只会避免这个问题。而且我还必须在Android手机上运行它,内存更加有限。)
所以,我考虑一次只从磁盘读取N个字节,而不是复制所有字节,然后从内存中读取它们。
我的问题是 - 最好的方法是什么?我不需要随机访问,因为我将按顺序读取文件。另外,我看到了多少减速?因为根据我的研究,硬盘访问比内存访问慢得多。
答案 0 :(得分:3)
你没有任何选择,所以'减速'不是一个考虑因素。你必须以一口大小的块来做。一次说64k。你甚至可能发现它更快。
答案 1 :(得分:0)
最简单的方法是使用CipherInputStream和CipherOutputStream类。这些课程负责缓冲或“零碎”加密。它们不一定完美取决于你想做什么。如果他们缺乏,那么你可以自己管理缓冲。 Cipher类当然充满了方便的块加密/解密方法。