2014-10-19 60 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()