Java如何高效检测文件inode变化

系统Linux,Windows下理论上通用。

Flume编写Source时候遇到一个问题,读文件代码如下:

File file = new File(this.file);
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),this.info.get("charset")));
while (true) {
	String line = reader.readLine();
	if(null != line){
		...
	}
	Thread.sleep(1000);
}

当目标文件重定向(>或>>)后读取不受影响,当用vi编辑或删除重建文件后无法继续读取(没有任何异常),经测试发现是因为文件Inode变了。

当然可以把创建reader的代码放到while循环内部,但是这样代价也太大了,而且因为是日志文件类型,inode变化的情况非常少。可以先用一种高效的方式检测inode是否变化,如果变化重新创建reader,代码如下:

File file = new File(this.file);
FileInputStream fi = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(fi,"UTF-8"));
while (true) {
		if(file.length()!=fi.getChannel().size()){
				fi = new FileInputStream(file);
				reader=new BufferedReader(new InputStreamReader(fi, "UTF-8"));
		}
		String line = reader.readLine();
		if (null != line) {
				System.out.println(line);
		}
		Thread.sleep(1000);
}

 

发表评论

电子邮件地址不会被公开。

*