问题使用场景:
从sftp获取字节流,使用BOMInputStream(commons-io包)去除utf-8 bom头,然后通过BufferedReader输出并存储到数据库;
BOMInputStream 使用:
BOMInputStream bomInputStream = new BOMInputStream(in, false, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE); 构造器会过滤首部三个字节的bom,另外BOMInputStream中 hasBOM()、getBOM()方法也会过滤bom。
原代码
// 从sftp获取流
in = sftpUtil.getInputStream(path + File.separator + fileName);
// 去除bom
BOMInputStream bomInputStream = new BOMInputStream(in, false, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE);
String charsetName = "UTF-8";
if (bomInputStream.hasBOM()) {
charsetName = bomInputStream.getBOMCharsetName();
logger.info("文件格式含有bom:" + charsetName + "," + bomInputStream.getBOM());
}
br = new BufferedReader(new InputStreamReader(bomInputStream, charsetName));
while ((line = br.readLine()) != null) { // 此处读取报错
// 输出
System.out.println(line);
}
解决办法:
经排查,是由于commons-io.jar 2.0版本在读取字节时有丢失或者转化异常问题;
commons-io.jar 2.0版本之后无此问题。