2014-10-19 28 views
0

我有这个函数加密文件,加密位似乎工作,但我不能让它覆盖当前文件。用密文覆盖明文文件

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位,它不会正确写入文件。

如何使用加密文本覆盖文件原始文件?

回答

1

如果您删除了.secure部分,您将尝试在写入文件的同时从该文件读取数据。这不是一个好主意......

最好的方法是按照你的方式去做,然后如果一切顺利,你可以删除原始文件并重命名旧的文件以匹配它的名字,使用Files.move()

实际上,如果您将正确的选项传递给Files.move(),则可以覆盖现有文件,这意味着您不需要先删除原来的文件。

这样可以解决您遇到的同时读写问题,但对于像这样的应用程序来说,这也是一个更安全的选择。如果您的应用程序崩溃或加密过程中断电,并且您正在进行加密,那么您已完全搞砸了。如果你这样做,那么中间的电源故障仍然会使你的旧文件完好无损。您将始终拥有完整的旧文件,直到完整的新文件准备就绪。

顺便说一句,你也应该使用BufferedInputStream,而不是仅仅使用原始FileInputStream。我无法在任何地方看到inputStream.close()