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

你可能感兴趣的:(java)