系统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);
}