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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值