2017-06-15 90 views
0

所以這可能是也可能不是一個愚蠢的問題,但我們在這裏!寫入文件問題

所以我試圖寫入一個文件,它不覆蓋,但它一遍又一遍地寫,所以我需要幫助。

方法:

@SuppressWarnings("resource") 
public static void writeFile(File file, String index) { 
    try { 
     boolean wri = false; 
     PrintWriter out = new PrintWriter(new FileWriter(file, true)); 
     Scanner scanner = new Scanner(file); 
     while(scanner.hasNext()) { 
      String str = scanner.nextLine(); 
      if(str.equals(index)) { 
       System.out.println(index); 
       scanner.close(); 
       wri = true; 
       break; 
      } else { 
       wri = false; 
       break; 
      } 
     } 

     if(wri != false) 
      return; 
     out.write(index); 
     out.write("\n"); 
     out.close(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

你的意思是它不覆蓋文件,而是在每次電話會議上追加它?如果是這樣,那是因爲在'FileWriter'中傳遞了'true',表示追加。但我不確定我是否正確地回答了這個問題。 – KevinO

+0

正如評論所暗示的,您正在使用相同的'file'來寫入(在'PrintWriter'中),正如您從(在Scanner中)讀取的那樣。這是預期的行爲? – KevinO

+0

@KevinO是的,我想檢查它是否先寫入,如果不是,寫入文件,否則不寫。 – BeastlyMC956

回答

2

你的代碼是完全錯誤的。

  • 不要nextLine()使用hasNext()。改爲使用hasNextLine()

  • 如果找不到index,請不要關閉scanner

  • 如果找到index,那麼您不關閉out

  • 即使您不需要寫任何東西,也可以打開寫入文件。

  • 您忽略異常。

  • if(wri != false)是一個非常模糊的方式來編寫if (wri)

  • 如果您只使用write()方法,則無需將FileWriter包裝在PrintWriter中。

由於顯式調用FileWriter constructorappend模式,我會假設你想寫index到文件,當且僅當文件不包含文本。

請注意,如果index包含換行符,則您的邏輯將不起作用。

既然你只能讀,你應該使用BufferedReader,而不是Scanner,因爲Scanner有一個非常大的開銷。

至於您沒有關閉資源,請使用try-with-resources

您的代碼應該是這樣的:

public static void writeFile(File file, String index) { 
    if (file.exists()) { 
     try (BufferedReader in = new BufferedReader(new FileReader(file))) { 
      for (String line; (line = in.readLine()) != null;) 
       if (line.equals(index)) 
        return; 
     } catch (Exception e) { 
      throw new RuntimeException("Error reading file: " + file, e); 
     } 
    } 
    try (FileWriter out = new FileWriter(file, true)) { 
     out.write(index); 
     out.write(System.lineSeparator()); 
    } catch (Exception e) { 
     throw new RuntimeException("Error appending to file: " + file, e); 
    } 
} 

測試

File file = new File("C:/temp/test.txt"); 
writeFile(file, "Hello"); 
writeFile(file, "World"); 
writeFile(file, "Hello"); 

文件內容

Hello 
World 
+0

完美的作品! – BeastlyMC956

-1

嘗試

PrintWriter out = new PrintWriter(new FileWriter(file, false)); 
+0

如果這樣做,文件將在'Scanner'循環之前清除,那麼循環的重點是什麼? – Andreas

+0

這隻寫了我說過的最後一件事。 – BeastlyMC956

+0

確實沒有意義,我認爲他得到了一些前面寫過的東西來處理它的文件,無論如何,我的答案顯示如何在寫入時逃避附加到文件。 – Frank