2014-10-19 4 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()으로 전달하면 기존 파일을 덮어 쓸 수 있으므로 원본을 먼저 삭제할 필요가 없습니다.

이것은 동시 읽기/쓰기 문제를 해결하지만 이와 같은 응용 프로그램에서도 훨씬 안전합니다. 응용 프로그램이 충돌하거나 암호화 중간에 전원이 끊어져 암호화가 제대로 이루어지지 않으면 완전히 망가지게됩니다. 이런 식으로하면 중간에 정전이 발생해도 이전 파일을 손상시키지 않습니다. 완전한 새 파일이 준비 될 때까지 항상 완전한 이전 파일을 갖게됩니다.

그런데 FileInputStream을 사용하는 대신 BufferedInputStream도 사용해야합니다. 어디서나 inputStream.close()을 볼 수 없습니다.