8

ストリームにデータを書き込むときに、次のコードが例外をスローすることを期待していました。

File file = new File("test.txt");
FileOutputStream fs = new FileOutputStream(file);
OutputStreamWriter ow = new OutputStreamWriter(fs);
BufferedWriter writer = new BufferedWriter(ow);

fs.close();

try {
    ow.write(65);
    writer.write("test");
} catch (Exception e) {
    e.printStackTrace();
}

BufferedWriter を閉じる必要があることは認識していますが、現在の環境では、BufferedWriter が閉じられる前に FileOutputStream が閉じられる可能性があります。FileOutputStream は、try/catch ブロックにヒットしてスタック トレースを出力するまで、チェーンを上に移動する必要がある IOException をスローするべきではありませんか?

fs.write(65) を呼び出そうとすると、例外がスローされます。

4

1 に答える 1

10

書き込み呼び出しの後にフラッシュを試みます。バッファリングされたストリームは、基になるストリームにまだコンテンツを書き込もうとしていない可能性があるため、基になるストリームが閉じられたことを認識していません。

編集:

試してみました。コードで:

File file = new File("test.txt");
FileOutputStream fs = new FileOutputStream(file);
OutputStreamWriter ow = new OutputStreamWriter(fs);
BufferedWriter writer = new BufferedWriter(ow);

fs.close();

try {
    ow.write(65);
    writer.write("test");
    writer.flush();
} catch (Exception e) {
    e.printStackTrace();
}

次の例外が発生します。

java.io.IOException: Bad file descriptor
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:260)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276)
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122)
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212)
    at java.io.BufferedWriter.flush(BufferedWriter.java:236)
    at Test.main(Test.java:16)
于 2010-03-16T19:55:48.270 に答える