1.文件的读取
读取UTF-8格式的CSV文件,要注意BOM的影响
UTF-8格式在CSV文件开头会有个隐式的字符 ’\uFEFF’
所以可以读取第一个字符来判断是否CSV文件是否是UTF-8格式的文件
当然要注意,要读取掉第一个字符也就是这个隐式字符 ’\uFEFF’,使用CsvToBean才能正确的读取到第一个字段;
List<T> parseList = Lists.newArrayList();
try(BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8));){
if (read != '\uFEFF') {
throw new BizException("File format error.");
}
CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(reader)
.withType(clazz)
.withIgnoreLeadingWhiteSpace(true)
.withSeparator(',')
.withQuoteChar('"')
.build();
parseList = csvToBean.parse();
}
2.导出UTF-8格式的CSV文件
response.setHeader("Content-Type","text/csv; charset=UTF-8");
String encodeName = URLEncoder.encode(fileName, "UTF-8");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
response.setHeader("content-Disposition", "attachment;filename*=" + encodeName+".csv");
//写上这句就ok了
outputStream.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});
只需要写上这个隐式字符标识BOM格式,给系统识别就ok啦
CsvToBean是opencsv
导这个依赖
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.4</version>
</dependency>