2013-08-22 85 views
1

我有一個簡單的應用程序,但垃圾文本文件(這只是實踐)我只用了3天的Java呢。問題是在運行程序之前沒有錯誤,然後它會拋出異常並停止。謝謝。 這是個例外:Java寫入文件。使用循環

 java.io.IOException: Stream closed 
    at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source) 
    at sun.nio.cs.StreamEncoder.write(Unknown Source) 
    at sun.nio.cs.StreamEncoder.write(Unknown Source) 
    at java.io.OutputStreamWriter.write(Unknown Source) 
    at java.io.Writer.write(Unknown Source) 
    at test.main(test.java:18) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at 
    edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 

這是代碼。

import java.io.FileWriter; 
import java.util.Random; 
import java.io.IOException; 
public class test { 
    public static void main(String[] args) throws IOException { 

     final String alphabet = "abcdefghigklmnopqrstuvwxyz"; 
     final int N = alphabet.length(); 
     Random r = new Random(); 

     FileWriter file = new FileWriter("hello.txt"); 
     String sb = " "; 
     for (int i = 0; i < 1;) { 
      sb += alphabet.charAt(r.nextInt(N)); 
      System.out.println(sb); 
      int length = sb.length(); 
      file.write(sb); 
      file.close(); 
      if (length == 30) { 
       sb = " "; 
      } 
     } 
    } 
} 
+5

歡迎來到StackOverflow;)當您詢問關於異常的問題時,請顯示堆棧跟蹤。 –

+0

什麼是例外? – ahmedalkaff

+0

什麼樣的例外?請編輯您的帖子並添加堆棧跟蹤。 – vanje

回答

8

問題是,您正在關閉您的FileWriter並嘗試再次使用它。

相反,關閉您已經完成了循環之後的作家:

try (FileWriter file = new FileWriter("hello.txt")) { 
    String sb = " "; 
    for (int i = 0; i < 1; i++) { // Note: added a i++ 
    sb += alphabet.charAt(r.nextInt(N)); 
    System.out.println(sb); 
    int length = sb.length(); 
    file.write(sb); 
    // file.close(); <---- NOPE: don't do this 
    if (length == 30) { 
     sb = " "; 
    } 
    } 
} 

感謝Andrew爲察覺的i++遺漏。

+1

請注意,該循環仍然只能在該條件下執行一次。對於我= 0 –

+0

謝謝!它完美的作品。 – Aras

1
FileWriter file = new FileWriter("hello.txt"); 
    String sb = " "; 

    for (int i = 0; i < 1; i++) { 
     sb += alphabet.charAt(r.nextInt(N)); 
     System.out.println(sb); 
     int length = sb.length(); 
     file.write(sb); 
     file.close(); 
     if(length == 30){ 
      sb = " "; 
     } 
    } 

您正在初始化FileWriter一次並在第一次迭代本身中關閉它,然後嘗試在下一次迭代中再次使用它。因此你得到一個例外。

我建議把你的for循環放在try語句中,並在finally語句中關閉FileWriter。 Here是關於try-catch-finally構造的oracle tut。

最終代碼會像下面

FileWriter file = null; 
    try { 
     try { 
      file = new FileWriter("hello.txt"); 
      String sb = " "; 
      for (int i = 0; i < 1; i++) { 
       sb += alphabet.charAt(r.nextInt(N)); 
       System.out.println(sb); 
       int length = sb.length(); 
       file.write(sb); 
       if (length == 30) { 
        sb = " "; 
       } 
      } 
     } finally { 
      file.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
0

只有閉上你的FileWriter流,一旦你完全使用完。

此外,FileWriter的寫入方法不包括僅用於String參數的方法。這可能是你閱讀文件時得到的垃圾。

1

您應該關閉for循環之外的FileWriter。

file.close(); 

與您的代碼的另一個問題是,沒有增量在環路上完成。因此它是一個無限循環,你的程序不會停止(在解決異常之後)。嘗試類似於:

for (int i = 0; i < 1; i++) 

或在正文中添加中斷條件。

1

當您關閉文件,如下面的行

file.close() 

這意味着你完成對文件的工作。

在你的情況下,你關閉循環中的文件,這意味着下一次迭代將引發異常。

將上述代碼移出循環。

1

實際寫作在一個循環是,除非你調用的文件不會發生。 flush()方法。

FileWriter fileWriter = new FileWriter("hello.txt"); 
try { 
    for (int i = 0; i < 10; i++) { 
     fileWriter.write(line); 
     fileWriter.flush(); 
    } 
} finally { 
    fileWriter.close(); 
}