Java BufferedWriter, outputStreamwriter 닫힌 파일 아웃 PutStream에 쓸 수 있습니다.
-
20-09-2019 - |
문제
스트림에 데이터를 작성했을 때 다음 코드가 예외를 던질 것으로 기대하고있었습니다.
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)
제휴하지 않습니다 StackOverflow