2013-08-22 84 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(); 
}