BufferedReader/FileReader无法正确读取右双引号(”)问题排查
解决Java读取含全角引号文件时的乱码问题
这明显是字符编码不匹配导致的问题——你的程序在读写文件时依赖了系统默认编码,而包含全角引号(”)的文件实际编码和默认编码不一致,导致字符被错误解析成陌生的乱码。
问题根源
Java里的FileReader和FileWriter类会自动使用系统默认字符编码(比如Windows下是GBK,Linux/macOS下是UTF-8)来处理文件。如果你的input.txt是用UTF-8编码保存的,但程序用GBK去读取,或者反过来,就会出现字符编码转换错误,把原本的全角引号变成奇怪的亚洲字符。
解决方案:显式指定UTF-8编码读写文件
修改你的代码,改用InputStreamReader和OutputStreamWriter,并明确指定编码为UTF-8,这样不管系统默认编码是什么,都能稳定处理包含特殊字符的文件。
示例代码如下:
import java.io.*; public class FileProcessor { public static void main(String[] args) { String inputPath = "input.txt"; String outputPath = "processed_input.txt"; // 建议先输出到新文件,确认后再覆盖原文件 try (BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream(inputPath), "UTF-8")); BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8"))) { String line; while ((line = reader.readLine()) != null) { // 移除连续空格,readLine已经自动去掉了换行符 String processedLine = line.replaceAll("\\s+", " "); writer.write(processedLine); // 如果需要保留原文件的行结构,可以在这里加writer.newLine(); } System.out.println("文件处理完成,结果已保存到 " + outputPath); } catch (IOException e) { e.printStackTrace(); } } }
额外注意事项
- 确保你的
input.txt本身是用UTF-8编码保存的(比如用记事本保存时选择“UTF-8”,不要选默认的ANSI) - 如果需要覆盖原文件,建议先备份,避免数据丢失
- 要是不确定文件的编码,可以用Notepad++这类编辑器查看文件的编码格式
内容的提问来源于stack exchange,提问作者JHam
相关产品推荐
相关产品推荐

