使用OpenCSV读取CSV文件时首行首字符出现特殊字符的问题
CSV首行出现
的问题处理 问题成因
是**UTF-8 BOM(字节顺序标记)**的乱码表现。如果CSV文件是以「带BOM的UTF-8」格式保存的,文件开头会附加三个隐藏字节(EF BB BF)。你当前使用的FileReader会默认采用系统编码解析内容,若系统编码不是UTF-8,这三个字节就会被错误解析成。
解决方法
方法1:指定UTF-8编码读取文件
FileReader不支持手动指定编码,换成InputStreamReader并明确指定UTF-8编码,确保文件字节被正确解析:
修改后的代码:
import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import com.opencsv.CSVReader; import java.nio.file.Paths; // ... 其他业务代码 File file = Paths.get(filePath.concat("/ReportTypes.csv")).toFile(); // 替换FileReader为指定UTF-8编码的InputStreamReader CSVReader reportTypesReader = new CSVReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)); String[] nextLine; while ((nextLine = reportTypesReader.readNext()) != null) { for (String token : nextLine) { // 手动移除可能残留的BOM标记 if (token.startsWith("\uFEFF")) { token = token.substring(1); } System.out.print(token); } System.out.print("\n"); }
方法2:手动移除BOM字符
如果不想修改读取流的编码方式,可以在读取内容后,手动移除开头的BOM标记(Unicode码为\uFEFF):
String[] nextLine; while ((nextLine = reportTypesReader.readNext()) != null) { for (int i = 0; i < nextLine.length; i++) { String token = nextLine[i]; // 判断并移除开头的BOM字符 if (token != null && token.length() > 0 && token.charAt(0) == '\uFEFF') { nextLine[i] = token.substring(1); } System.out.print(nextLine[i]); } System.out.print("\n"); }
方法3:使用OpenCSV高级构建器(适用于4.x及以上版本)
如果使用OpenCSV新版本,可通过CSVReaderBuilder配合自定义Reader处理BOM,灵活性更高:
import com.opencsv.CSVReader; import com.opencsv.CSVReaderBuilder; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.nio.file.Paths; // ... 其他业务代码 File file = Paths.get(filePath.concat("/ReportTypes.csv")).toFile(); InputStreamReader reader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); // 手动跳过文件开头的BOM reader.mark(1); if (reader.read() != '\uFEFF') { reader.reset(); } CSVReader reportTypesReader = new CSVReaderBuilder(reader).build(); // 后续读取逻辑不变
内容的提问来源于stack exchange,提问作者purush
相关产品推荐
相关产品推荐

