0

Java에서 FileOutputStreamBufferedWriter을 사용하여 문제가 발생했습니다.공간 부족시 FileOutputStream 닫기

내 디스크 공간이 가득 차서 쓰기를 시도하면 IOException (올바른 내용)이 표시되지만 writer.close()를 호출하면 리소스를 닫지 않고 다른 IOException을 던집니다. 자원을 열어 두는 것!

내 해결 방법은 writer.flush()입니다. 작동하는 것처럼 보이지만이를 처리 할 수있는 더 좋은 방법이 있습니까? 당신이 그들을 연 순서의 역순

BufferedWriter writer = null; 

    try { 
     writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), encoding)); 
     StringBuilder buff = new StringBuilder(); 
     writeToStream(buff, separator, data); 
     writer.write(buff.toString()); 
     writer.flush(); // flush before closing to make sure there is enough space on disk to complete the close() 
     logger.trace("writeFile: file written, file={}", file); 
    } catch (IOException e) { 
     logger.error("writeFile: cannot write to file: {}", file, e); 
     throw new ... //some exception wrapper here 
    } finally { 
     if (writer != null) { 
       try { 
        writer.close(); 
       } catch (IOException e) { 
        // ignore 
       } 
      } 
    } 
+0

try-with-resources –

+1

write()가 예외를 throw하면 flush()가 실행되지 않으므로 ... 도움이되지 않는다고 생각합니다. – jamp

+0

.flush (.close() 전에 .close()는 .flush() (이전에 완료되지 않은 경우 메소드 내부에서 호출 됨)를 수행 할 때 실패하므로 IOException을 발생시킵니다. try 블록에서 .flush()를 수행하면 디스크 공간이 부족한 경우 IOException이 발생하고 예외없이 .close()를 호출 할 수 있습니다. BufferedWriter는 이미 "플러시 모드"로, .close()가 작동합니다). 거기에 더 좋은 해결책이 있다고 확신합니다. 감사합니다 – Matt

답변

2

당신은 시도해야하고 가까운 모든 자원. 여기서 하나만 닫으십시오.

Java 7을 사용하는 경우 try-with-resources 문을 사용하십시오. 그렇지 않으면, 그렇게하는 가장 좋은 방법은 (버전 14.0부터 사용 가능) Guava's Closer을 사용하고 있습니다 : 당신이 Closer이없는 경우, 다시 충분히 쉽게

final Closer closer = Closer.create(); 
final FileOutputStream out; 
final OutputStreamWriter writer; 
final BufferedWriter buffered; 

try { 
    out = closer.register(new FileOutputStream(file), encoding)); 
    writer = closer.register(new OutputStreamWriter(out)); 
    buffered = closer.register(new BufferedWriter(writer)); 
    // do stuff 
} catch (IOException e) { 
    throw closer.rethrow(e); 
} finally { 
    closer.close(); 
} 

.

+0

BufferedWriter에 Closer를 작성한다는 요지를 이해하지 못합니다 ... OutputStream을 직접 명시 적으로 닫지 않아도됩니다. BufferedWriter는 기본이되는 라이터를 닫습니다. 나는 BufferedWriter를 사용하지 않고 FileOutputWriter만으로 동일한 문제를 겪었으므로 클로저를 사용하더라도 문제가 지속될 수있다. 감사합니다 – Matt

+0

글쎄, 그것을보십시오;) – fge

+0

그것은 내 친구, 감사 작동 :) – Matt