【问题标题】:Java write to file. Using a loopJava 写入文件。使用循环
【发布时间】:2013-08-22 12:32:22
【问题描述】:

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

【问题讨论】:

  • 欢迎来到 StackOverflow ;) 当您询问有关异常的问题时,请显示堆栈跟踪。
  • 有什么异常?
  • 您的 for 循环不会增加 i。事实上它的状态也看起来很奇怪
  • Offtopic:类名应该以大写字母开头。这是一个被广泛接受的惯例。
  • 循环中有file.close()

标签: java string file


【解决方案1】:

问题是您正在关闭 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++ 遗漏。

【讨论】:

  • 请注意,循环仍然只在该条件下执行一次。对于 i = 0
【解决方案2】:

除非你调用file.flush()方法,否则while在循环中的实际写入不会发生

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

【讨论】:

    【解决方案3】:
    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();
        }
    

    【讨论】:

      【解决方案4】:

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

      file.close();
      

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

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

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

      【讨论】:

        【解决方案5】:

        当你在下面一行关闭文件时

         file.close()
        

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

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

        将上述代码移出循环。

        【讨论】:

          【解决方案6】:

          只有在您完全使用完 FileWriter 流后才关闭它。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-14
            • 2016-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多