You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:32:37