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
相关产品推荐
相关产品推荐

