2013-06-22 63 views
0

我目前正在寫一個加密程序,用64位加密加密文本文檔。它的工作方式是它需要一個字符串,並對字符串進行加密。我正在尋找一種方法讓程序將文件的所有內容存儲在一個字符串中,對字符串進行加密,然後用加密的字符串覆蓋文件。然而,使用如何一次讀取或替換多個文件行?

while((bufferedReader.readLine()) != null) { 
... 
} 

它只讀取和加密第一行,其餘部分保持不變。

然而,使用:

  List<String> lines = Files.readAllLines(Paths.get(selectedFile.toString()), 
       Charset.defaultCharset()); 
     for (String line : lines) { 
     ... 
     } 

僅最後一行被加密。我真的不知道該做什麼,因爲我有點想法。

這裏是我當前的代碼(也只追加到文件,因爲我嘗試新的東西。):

public static void Encrypt() throws Exception { 

    try { 

     FileWriter fw = new FileWriter(selectedFile.getAbsoluteFile(), true); 
     BufferedWriter bw = new BufferedWriter(fw); 

     List<String> lines = Files.readAllLines(Paths.get(selectedFile.toString()), 
       Charset.defaultCharset()); 
     for (String line : lines) { 
      System.out.println(line); 
      System.out.println(AESencrp.encrypt(line)); 
      bw.write(AESencrp.encrypt(line)); 
     } 

     bw.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

回答

2

BufferedReader#readLine將返回文本從閱讀器讀取行。以你爲例,你忽略了返回值。

相反,你應該做這樣的事情......

String text = null; 
while((text = bufferedReader.readLine()) != null) { 
    // Process the text variable 
} 
+0

這是第一件事我試過一個加密的文本,但我不能想出一個辦法,使文件只作家替換它正在閱讀的整條線。例如,FileWriter會追加並僅添加加密,在FileWriter完全刪除文件的其餘部分之前,只加密第一行。這就是爲什麼我希望有一種方法可以同時讀取整個文檔並將整個文件存儲在字符串中。 –

+0

您需要寫入臨時文件,一旦競爭並關閉流,您將刪除舊文件並在其位置重命名新文件。同時讀取和寫入文件非常困難 – MadProgrammer

0

嘗試了下:

public static void Encrypt() throws Exception { 
    try { 
     Path path = Paths.get(selectedFile.toURI()); 
     Charset charset = Charset.defaultCharset(); 

     // Read file 
     List<String> lines = Files.readAllLines(path, charset); 

     // Encrypt line 
     lines.set(0, AESencrp.encrypt(lines.get(0))); 

     // Write file 
     Files.write(path, lines, charset); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
1

我不認爲通過線加密線是一個好主意。我會做這樣

Cipher cipher = ... 
Path path = Paths.get(file); 
File tmp = File.createTempFile("tmp", ""); 
try (CipherOutputStream cout = new CipherOutputStream(new FileOutputStream(tmp), cipher)) { 
    Files.copy(path, cout); 
} 
Files.move(tmp.toPath(), path, StandardCopyOption.REPLACE_EXISTING); 

和閱讀這樣

Scanner sc = new Scanner(new CipherInputStream(new FileInputStream(file), cipher)); 
while(sc.hasNextLine()) { 
    ... 
相關問題