我有这个加密文件的功能,加密位似乎正在工作,但我不能让它覆盖当前文件。
FileInputStream inputStream = new FileInputStream(input); // Selects file to encrypt
cipher.init(Cipher.ENCRYPT_MODE, secret, ivSpec); // Sets up the encryption
// Creates an the output stream, the encryption is performed here
CipherOutputStream cos = new CipherOutputStream(new FileOutputStream(input + ".secure"), cipher);
byte[] block = new byte[8];
int i;
while ((i = inputStream.read(block)) != -1) // Reads the file
{
cos.write(block, 0, i); // Writes the new file
}
cos.close();
这样工作正常,我最终得到一个加密文件original_file_name.txt.secure
,但我希望它覆盖原始文件。如果我删除了.secure
位,它就不能正确写入文件。
如何使用加密文本覆盖文件原始文件?
答案 0 :(得分:1)
如果您删除了.secure
部分,那么您将尝试在写入文件的同时阅读该文件。这不是一个好主意......
最好的方法是在您完成后完成,然后如果一切顺利,您可以使用Files.move()
删除原始文件并重命名旧文件以匹配其名称。< / p>
事实上,如果您将正确的选项传递给Files.move()
,则可以让它覆盖现有文件,这意味着您不需要首先删除原始文件。
这解决了您所拥有的同时读/写问题,但对于像这样的应用程序来说它也更加安全。如果您的应用程序崩溃或在加密过程中出现断电,并且您正在加密,那么您就完全搞砸了。如果你这样做,那么中间的电源故障仍然会让你的旧文件保持原样。在完整的新文件准备好之前,您将始终拥有完整的旧文件。
顺便说一下,您也应该使用BufferedInputStream
,而不是仅仅使用原始FileInputStream
。我无法在任何地方看到inputStream.close()
。