1

テキストファイルを破棄する単純なアプリケーションがあります (これは単なる練習です)。Java を使用してまだ 3 日しか経っていません。問題は、プログラムを実行するまでエラーが発生せず、例外がスローされて停止することです。ありがとうございました。これは例外です:

      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 = " ";
    }
  }
}

省略を見つけてくれたAndrewに感謝します。i++

于 2013-08-22T12:35:27.600 に答える
3

ループの実際の書き込みは、 file を呼び出さない限り行われません。フラッシュ()メソッド。

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 に答える
1

for ループの外側で FileWriter を閉じる必要があります。

file.close();

コードのもう 1 つの問題は、ループ内でiに対してインクリメントが行われないことです。したがって、これは無限ループであり、プログラムは停止しません (例外を解決した後)。次のようなものを試してください:

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

または本体内にブレーク条件を追加します。

于 2013-08-22T12:44:27.720 に答える
1

次の行のようにファイルを閉じると

 file.close()

これは、ファイルの操作が完了したことを意味します。

あなたの場合、ループ内でファイルを閉じます。つまり、次の反復で例外がスローされます。

上記のコードをループの外に移動します。

于 2013-08-22T12:44:37.313 に答える