Java PrintWriter無法寫入的問題

項目日誌出現莫名其妙的缺失,從當天某個時間段之後日誌就全部沒有了。日誌每3秒寫入一次,文件最後的修改時間距離日誌最後記錄的時間相差幾分鐘,排除人爲刪除的因素之後,技術層面發現了一些問題。

Writer的創建

PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file, true), "UTF-8"));

日誌寫入

writer.println(data);
writer.flush();

檢查發現,日誌寫入時文件是一直被佔用的。若強行解除文件佔用,就會出現文件無法寫入,而且不會拋出異常的問題。初步判斷爲人爲查看日誌時意外修改導致文件被解除佔用,具體原因不明。

修正方法:寫入數據後使用writer.checkError()方法檢查是否存在錯誤,若有,則重新創建writer,將數據再寫一遍。


java.io.PrintWriter 此類中的方法不會拋出 I/O 異常,儘管其某些構造方法可能拋出異常。客戶端可能需要通過調用 checkError() 檢查是否出現錯誤。
java.io.PrintWriter.checkError() 
該方法刷新流,如果它尚未關閉,並檢查其錯誤狀態。
如果打印流在底層輸出流或格式轉換期間遇到錯誤,該方法返回true

修正代碼:

writer.println(data);

			if (writer.checkError())
			{
				try
				{
					createWriter();
					writer.println(data);
					if (writer.checkError())
					{
						Log.error("日誌重建異常!data:" + data);
					}
				}
				catch (Exception e)
				{
					Log.error("日誌寫入異常!" + data, e);
				}
			}
writer.flush();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章