2012-06-26 71 views
0

那麼,我正在嘗試編寫一行信息來登錄文本文件(.txt),但這是代碼無法寫入的部分。除此之外,其他一切都有效,但不會給出任何錯誤。Write-to-file代碼不寫

public void writeConfig(File config, Boolean append, String errored){ 
    try { 
     Writer output; 
     if (config != null){ 
      output = new BufferedWriter(new FileWriter(config)); 
     } else { 
      output = new BufferedWriter(new FileWriter(er)); 
     } 
     if (append == true){ 
      output.append(errored); 
     } else { 
      output.write(errored); 
     } 
    } catch (Exception e){ 
     try { 
      loadErrorLog(error, true, "Failed to write to Boom's Log.\n"); 
     } catch (Exception e1){ 
      log.info("Major Malfunction #686 : Tell Maker immediatly."); 
     } 
    } 
} 
+1

爲什麼'append'一個'Boolean'而不是一個'boolean'? –

回答

4

您沒有關閉寫入器,這意味着所有的數據都停留在緩衝區中。

您應該在finally塊中關閉它。

此外:

  • 您的append參數的使用也明顯狡猾的 - 你應該幾乎可以肯定它傳遞給FileWriter(或FileOutputStream)的構造函數。我不認爲appendWriter做你認爲它做。
  • 儘量避免與true比較 - 只是if (append)本來清晰的
  • 使用條件運算符可以使你的FileWriter代碼更加清晰,特別是如果你使用它只是的文件:

    File file = config == null ? er : config; 
    Writer writer = new BufferedWriter(new FileWriter(file)); 
    
  • 我會首先避免使用FileWriter,因爲它總是使用平臺默認編碼。使用包含在OutputStreamWriter中的FileOutputStream來替代,明確指定編碼(例如UTF-8)
  • 避免在大多數地方捕獲Exception;這裏只需要抓住IOException就夠了。
  • 它看起來像你的loadErrorLog方法可能應該是這樣做的日誌記錄失敗,否則我懷疑你會每編寫代碼時,你叫它。
  • 如果您未能編寫配置,您是否真的想繼續?是否這個應該處理異常的方法?我可能完全除去catch塊(只留下一個try/finally),並讓IOException氣泡在棧中向上
+0

我需要先輸出.flush()嗎? – KeirDavis

+1

@KeirDavis:我不會 - 關閉意味着無論如何都要衝洗。我相信有一些奇怪的錯誤情況,在發生異常後可能不會刷新,但我個人不會擔心這種情況。 –

+1

+1關於'if(append)'的唯一注意事項是由於某種原因append是'Boolean'而且可能是'null'我會建議追加一個'boolean' –