1

我有一个简单的应用程序,但是会丢弃一个文本文件(这只是练习)我只有 3 天使用 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 = " ";
            }
        }
    }
}
4

6 回答 6

9

问题是您正在关闭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 = " ";
    }
  }
}

感谢安德鲁发现i++遗漏。

于 2013-08-22T12:35:27.600 回答
3

除非您调用文件,否则不会循环中进行实际写入。冲洗()方法。

FileWriter fileWriter = new FileWriter("hello.txt");
try {
    for (int i = 0; i < 10; i++) {
         fileWriter.write(line);
         fileWriter.flush();
    }
} finally {
     fileWriter.close();
}
于 2016-10-19T07:47:21.360 回答
2
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。是关于 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();
    }
于 2013-08-22T12:38:30.950 回答
1

您应该在 for 循环之外关闭 FileWriter。

file.close();

您的代码的另一个问题是循环中没有对i进行任何增量。因此这是一个无限循环,您的程序不会停止(在解决异常之后)。尝试类似:

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

或在正文中添加中断条件。

于 2013-08-22T12:44:27.720 回答
1

当您按照以下行关闭文件时

 file.close()

这意味着您已完成对文件的处理。

在您的情况下,您关闭循环中的文件,这意味着下一次迭代将引发异常。

将上述代码移出循环。

于 2013-08-22T12:44:37.313 回答
0

仅在完全使用完 FileWriter 流后才关闭它。

此外,FileWriter 的 write 方法不包括仅用于 String 参数的方法。这可能是您在读取文件时得到的垃圾。

于 2013-08-22T12:43:51.393 回答