2010-12-13 62 views
2

這裏是代碼片段。爲什麼bufferedwriter不在文件中寫入?

read = new FileReader("trainfiles/"+filenames[i]); 
       br = new BufferedReader(read); 
       while((lines = br.readLine())!=null){ 
        st = new StringTokenizer(lines); 
        while(st.hasMoreTokens()){ 
         bw = new BufferedWriter(new FileWriter("files/file.txt")); 
         bw.write(st.nextToken()); 
         bw.newLine(); 
        } 
       } 

編輯: 我正在從目錄讀取文件。所以,我需要在每個循環中打開讀者。我做了一些修改,但也沒有寫入該文件。 下面是代碼:

for(i=0;i==0;i++){ 
      if(filenames[i].matches(".*ham.*")){ 
       System.out.println("ham:"+filenames[i]); 
       read = new FileReader("trainfiles/"+filenames[i]); 
       br = new BufferedReader(read); 
       while((lines = br.readLine())!=null){ 
        st = new StringTokenizer(lines); 
        while(st.hasMoreTokens()){ 
         System.out.println(st.nextToken()); 
         bw.write(st.nextToken()); 
        } 
       } 
       bw.close(); 
       br.close(); 

      }else{ 
       System.out.println("spam:"+filenames[i]); 
      } 
         } 

編輯: 我修改了代碼,但沒有成功,

while((lines = br.readLine())!=null){ 
        st = new StringTokenizer(lines); 
        bw = new BufferedWriter(new FileWriter("files/file.txt")); 
        while(st.hasMoreTokens()){ 
         System.out.println(st.nextToken()); 
         bw.write(st.nextToken()); 
        } 
        bw.close(); 
       } 

       br.close(); 

,我得到這個錯誤:Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(StringTokenizer.java:332) at Test.main(Test.java:30)

編輯: 感謝球員。 。 我想到了。其實我在eclipse中創建了一個目錄,我沒有刷新它來查看內容。它的傻...... anyways.thanks很多

+1

是否有錯誤訊息?是否創建了一個文件?你打電話close()嗎? – jzd 2010-12-13 15:07:32

+0

爲什麼你爲每一個寫你實例化一個新的BufferedWriter?此外,你應該總是關閉所有開放的流(工作完成後,ofc :-))。 – helpermethod 2010-12-13 15:08:31

+0

在您上次編輯之後,您仍然在循環中創建BufferedWritter。這會截斷你的文件 – Tiago 2010-12-13 15:37:43

回答

10
  • 您正在循環中創建FileWritter,因此您將始終在每個循環中截斷文件。
  • 你忘了關閉/刷新寫入器
  • 但有一些運氣(終止程序可能會導致寫入器刷新),該文件將包含輸入文件的最後一個單詞,我只能猜測會是一個新行當你打開文件檢查內容時,你可能會錯過。

你的內循環應該是這樣的:

try (BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"))) { 
    while (st.hasMoreTokens()) { 
     bw.write(st.nextToken()); 
     bw.newLine(); 
    } 
} 
+0

代碼不完整,例如我沒有聲明看起來像是導致異常的Tokenizer。這只是一個示例來指導你:) – Tiago 2010-12-13 15:33:00

+0

bw.close()非常重要。感謝您的建議。 – Keyul 2016-07-09 05:56:04

+1

如果您提供的代碼片段中存在某個「IOException」,則不會調用bw.close()。請考慮在答案中使用'try-with-resources'構造。 – 2016-09-30 14:51:15

14

幾件事情:

  1. 你通過循環,這將每次截斷文件創建一個新的FileWriter各一次。
  2. BufferedWriter被緩衝,你永遠不會沖洗緩衝區。您需要調用bw.flush(),或者甚至更好,完成後關閉寫入器。
+0

更好的是,在幸福的情況下刷新裝飾器。在'finally'關閉底層資源。 (ObFileWriterComment:'FileWriter'選擇當時恰好是「默認」的字符編碼,明顯地選擇一種編碼,這意味着迴避'FileWriter'(使用'OutputStreamWriter')。) – 2010-12-13 15:13:50

+0

closing提供了隱式沖洗,所以在最後的最簡單的代碼關閉是足夠的。 – Darron 2010-12-13 19:11:47

0

理想情況下,你應該使用下面的構造函數來創建FileWriter

bw = new BufferedWriter(new FileWriter("files/file.txt",true)); 

第二個參數,true是追加新的數據。 FileWriter不會截斷先前的寫入。

和您的讀者將能夠讀取正確的數據。

相關問題