解决csv文件读取时第一列无法读取到的问题
在使用opencsv做csv文件导出与导入的时候,由于导入的csv文件带有bom标识,导致老是文件的第一列无法读取,下面贴出解决方法:
症状:
- 使用opencsv进行文件读取时,无法读取到第一列的内容
原因:
- csv文件带有bom头
解决方法:
- 方法一:notepad++打开csv文件,在“编码”处选择“使用utf-8编码”,然后导入
- 方法二:在java后台去掉文件数据流中的bom头,去除方法如下:
/**
* 读取流中前面的字符,看是否有bom,如果有bom,将bom头先读掉丢弃
*
* @param in
* @return
* @throws IOException
*/
public static InputStream getInputStream(InputStream in) throws IOException {
PushbackInputStream testin = new PushbackInputStream(in);
int ch = testin.read();
if (ch != 0xEF) {
testin.unread(ch);
} else if ((ch = testin.read()) != 0xBB) {
testin.unread(ch);
testin.unread(0xef);
} else if ((ch = testin.read()) != 0xBF) {
throw new IOException("错误的UTF-8格式文件");
} else {
}
return testin;
}
然后进行读取csv文件的代码:
// 此处的file为multipartfile格式
try {
InputStream inputStream = getInputStream(file.getInputStream());
InputStreamReader reader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
HeaderColumnNameMappingStrategy strategy = new HeaderColumnNameMappingStrategy();
strategy.setType(TestDTO.class);
if(null != reader) {
CsvToBean csvToBean = new CsvToBeanBuilder<TestDTO>(reader).withMappingStrategy(strategy).build();
List<TestDTO> testDTOLists = csvToBean.parse();
for(int i=0;i<testDTOLists.size();i++){
System.out.println("testDTOList======"+testDTOLists);
}
reader.close();
return true;
}
} catch (IOException e) {
e.printStackTrace();
return false;
}