BufferedWriter无UTF-8支持致西里尔文及特殊字符写入乱码问题
解决BufferedWriter写入西里尔文及特殊拉丁符号乱码问题
问题核心是FileWriter默认采用系统平台编码,而非你需要的UTF-8,导致西里尔文、ą/ł/ó/ę这类特殊符号写入时被错误编码,读取时用UTF-8解析就出现乱码。
修复方案:替换FileWriter为OutputStreamWriter(指定UTF-8编码)
FileWriter不支持显式指定编码,改用OutputStreamWriter结合FileOutputStream,强制以UTF-8编码写入,就能保证所有特殊符号正常存储。
修正后的完整写入代码:
import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class FileWriterFix { public static void main(String[] args) { Scanner sc = new Scanner(System.in, StandardCharsets.UTF_8); // 用OutputStreamWriter指定UTF-8编码,追加模式通过FileOutputStream的第二个参数true开启 try (BufferedWriter writer = new BufferedWriter( new OutputStreamWriter( new FileOutputStream("C:\\Users\\ouzhi\\OneDrive\\Документы\\cardsLibrary\\input.txt", true), StandardCharsets.UTF_8))) { while (true) { System.out.print("Import a line to write: "); String userInput = sc.nextLine().toLowerCase(); if (userInput.equals("stop")) { break; } String[] words = userInput.split(" "); if (words.length >= 3 || words.length == 1) { System.out.println("Please,enter two words"); continue; } else { writer.write(userInput); writer.newLine(); writer.flush(); } } } catch (Exception e) { e.printStackTrace(); } finally { sc.close(); } } }
关键说明:
- 用
try-with-resources语法(Java 7+支持),无需手动关闭流,自动处理资源释放,避免内存泄漏。 - 你的读取代码已经采用了正确方式:
InputStreamReader指定StandardCharsets.UTF_8,保持读写编码一致即可正常解析文件内容。
内容的提问来源于stack exchange,提问作者ouzhizus
相关产品推荐
相关产品推荐

