2013-06-28 51 views
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

嘗試與資源 – 2013-06-28 13:39:55

+1

如果write()拋出一個異常,然後flush()不執行...所以我不認爲這是幫助... – jamp

+0

如果我不做一個.flush( )在.close()之前,.close()拋出一個IOException,因爲它將在執行.flush()時失敗(如果以前沒有在該方法內調用該方法)。如果我在try塊中執行.flush(),它會拋出一個IOException(當磁盤空間不足時),我可以毫無例外地調用.close()(BufferedWriter已經處於「刷新模式」並且.close () 將工作)。我確信有更好的解決方案。謝謝 – Matt

回答

2

你應該嘗試關閉所有資源在你已經打開它們相反的順序。在這裏你嘗試只關閉一個。

如果您有Java 7,請使用try-with-resources語句。如果你不這樣做,這樣做的最好方法是使用Guava's Closer(可用自14.0版本):

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(); 
} 

如果沒有Closer做,這是很容易重新創建。

+0

我不明白在BufferedWriter上創建Closer的意義......你不需要明確地關閉OutputStream。 BufferedWriter關閉了底層的作者。我單獨使用FileOutputWriter也遇到同樣的問題(不使用BufferedWriter),所以即使使用Closer,問題也會持續存在。謝謝 – Matt

+0

好吧,試試吧,看看;) – fge

+0

它適合我的朋友,謝謝:) – Matt

相關問題