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

Java读取FileWriter保存的CSV文件乱码,文本编辑器显示正常求原因?

问题根源与解决方案

从你输出的PK ! T��ep [Content_Types].xml这类内容来看,你的Java代码读取的根本不是CSV文本文件,而是一个Excel的.xlsx格式文件!

为什么会这样?

.xlsx格式本质是一个ZIP压缩包,内部包含了XML结构的表格数据和配置文件,PK是ZIP文件的标志性开头签名。当你用FileReader(文本读取工具)去读取二进制的ZIP压缩内容时,自然会输出一堆乱码字符。

至于Sublime Text能正常显示,大概率是你在Sublime里打开的是正确的CSV文件,但Java代码中nom_office变量指向的却是另一个.xlsx文件——仔细检查下文件路径和后缀,是不是把.xlsx误当成了.csv?或者保存CSV时操作失误,实际生成的是Excel文件?


解决方向

1. 确认读取的是正确的CSV文件

  • 打开nom_office指向的文件所在文件夹,检查文件后缀是否为.csv,而非.xlsx。
  • 用记事本打开该文件:如果显示正常的CSV文本内容,说明文件正确;如果也是乱码,那这个文件本身就是.xlsx格式。

2. 正确读取CSV文件(确保文件为真实CSV)

就算文件是正确的CSV,FileReader和FileWriter默认使用系统平台编码(比如Windows下的GBK),如果你的CSV是用UTF-8编码保存的(Sublime Text默认多为UTF-8),直接读取也会乱码。此时需指定编码读取:

StringBuilder sb = new StringBuilder();
try {
    String ligne;
    // 指定UTF-8编码读取文件
    BufferedReader fichier1 = new BufferedReader(
        new InputStreamReader(new FileInputStream(nom_office), StandardCharsets.UTF_8)
    );
    while ((ligne = fichier1.readLine()) != null) {
        sb.append(ligne).append(System.lineSeparator()); // 补回readLine去掉的换行符
    }
    fichier1.close();
} catch (Exception e) {
    e.printStackTrace();
}
String totalité = sb.toString();

3. 如果确实需要读取Excel(.xlsx)文件

若你的需求是读取.xlsx文件,不能用文本读取器,需使用专门的Excel解析库(比如Apache POI):

  • 先添加Maven依赖(以POI 5.2.5为例):
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.5</version>
</dependency>
  • 示例读取代码:
try (XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(nom_office))) {
    XSSFSheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
    for (Row row : sheet) {
        StringBuilder rowContent = new StringBuilder();
        for (Cell cell : row) {
            // 根据单元格类型处理内容
            switch (cell.getCellType()) {
                case STRING:
                    rowContent.append(cell.getStringCellValue()).append(",");
                    break;
                case NUMERIC:
                    rowContent.append(cell.getNumericCellValue()).append(",");
                    break;
                // 按需处理其他类型(如布尔值、公式等)
                default:
                    rowContent.append(",");
            }
        }
        // 移除末尾多余的逗号并打印
        System.out.println(rowContent.length() > 0 ? rowContent.substring(0, rowContent.length()-1) : "");
    }
} catch (Exception e) {
    e.printStackTrace();
}

内容的提问来源于stack exchange,提问作者lolveley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:23:36