由于我们大数据平台需要采集各个系统数据,各个系统的数据格式和质量也参差不齐。之前我写了个通用采集程序(支持ftp,sftp,database等)
1)为了便于入库到仓库的数据进行数据源追溯;
2)部分接口文件名含有关键信息,而文件数据里又没有这些信息,需要通过截取文件名来补充该关键信息;
所以我们的采集程序需要在采集之后的文件里每行记录之后都追加文件名以及文件行号
这就不是简单的数据流Copy了。
很尴尬的是,有的文件是以\n(linux)作为行分隔符,有的文件是以\r(mac)作为行分隔符,有的文件是以\r\n(windows)作为行分隔符;
更尴尬的是,当以\n作为行分隔符时,有些数据里含有\r字符。这对上游系统来说也没毛病,但是我们处理就要小心了。
尝试使用BufferReader,LineNumberReader等设置行分隔符,但是这些都不带这么玩,不给设置。也尝试设置系统环境变量System.setProperty(“line.separator”,"\n")之后,用以上类读文件,但是还是会把\r,\r\n等识别为换行。
本人又不太想基于原始字节流读取判断,查阅各种,终于找到这个类:
java.util.Scanner,也是jdk自带的,无需额外引入包。
Scanner scan = new Scanner(inputStream,fileEncoding);
#在这里设置行分隔符,并且也支持多分隔符(正则表达式)
scan.useDelimiter("\n");
//如果想同时以\n、\r、\r\n作为行分隔符,可以这么设置
//scan.useDelimiter("\r\n|\r|\n");//注意\r\n必须在前面哦
String line = null;
for(int lnr=1;scan.hasNext();lnr++){
line = scan.next();
//line就是行内容,lnr 就是行号啦
}