Java BufferedWriter, outputStreamwriter 닫힌 파일 아웃 PutStream에 쓸 수 있습니다.

StackOverflow https://stackoverflow.com/questions/2457571

문제

스트림에 데이터를 작성했을 때 다음 코드가 예외를 던질 것으로 기대하고있었습니다.

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를 닫아야한다는 것을 알고 있지만 현재 환경에서는 버퍼링 라이터가 닫히기 전에 FileOutputStream이 닫힐 수 있습니다. FileOutputStream이 IOException을 던져서 시도/캐치 블록에 맞을 때까지 체인을 올라가야하고 스택 추적을 인쇄해야합니까?

fs.write (65)를 호출하려고하면 예외가 발생합니다.

도움이 되었습니까?

해결책

쓰기 호출 후 플러싱을 시도하십시오. 버퍼링 된 스트림은 아직 컨텐츠를 기본 스트림에 쓰려고 시도하지 않았을 수 있으므로 기본 스트림이 닫혀 있음을 깨닫지 못했습니다.

편집하다:

방금 시도했습니다. 코드와 함께 :

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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top