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