1. 在代码中显式指定编码(最推荐)
在文件读写操作时,通过InputStreamReader(读取)、OutputStreamWriter(写入)或Files工具类显式指定编码,确保编码设置明确,避免依赖系统默认值。
OutputStreamWriter包装FileOutputStream,指定编码(如UTF-8)写入文件;使用InputStreamReader包装FileInputStream,指定相同编码读取文件。// 写入文件(UTF-8)
try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8")) {
writer.write("Hello, 世界!");
} catch (IOException e) {
e.printStackTrace();
}
// 读取文件(UTF-8)
try (InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8")) {
int data;
while ((data = reader.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
Files.newBufferedReader/Files.newBufferedWriter方法可直接指定Charset(如StandardCharsets.UTF_8),代码更简洁,且支持缓冲提高性能。import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
// 写入文件(UTF-8)
List<String> lines = List.of("第一行", "第二行");
try {
Files.write(Paths.get("test.txt"), lines, StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
}
// 读取文件(UTF-8)
try {
List<String> readLines = Files.readAllLines(Paths.get("test.txt"), StandardCharsets.UTF_8);
readLines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
2. 通过命令行参数指定JVM默认编码
在启动Java程序时,添加-Dfile.encoding参数设置JVM全局默认编码,适用于需要统一调整所有文件操作的场景(如服务器环境)。
# 启动时指定UTF-8编码
java -Dfile.encoding=UTF-8 -jar YourApp.jar
注意:此方法会影响JVM内所有未显式指定编码的文件操作(如FileReader/FileWriter),但不推荐替代代码中的显式设置(代码显式设置更灵活、更安全)。
3. 在IDE中配置项目编码
开发阶段,通过IDE设置项目默认编码,确保团队成员的代码和资源文件使用一致编码(如UTF-8),避免本地环境差异导致的乱码问题。
File → Settings → Editor → File Encodings,设置Global Encoding、Project Encoding和Default encoding for properties files为UTF-8,点击Apply。Properties → Resource → Text file encoding,选择Other→UTF-8,点击Apply。4. 在构建工具中配置编码
若使用Maven或Gradle构建项目,可在配置文件中指定编译和运行时的编码,确保构建过程的一致性。
pom.xml的properties中添加:<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
build.gradle中添加:allprojects {
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
}
5. 注意事项
FileReader/FileWriter(默认使用系统编码),始终显式指定编码。file -i test.txt)验证文件编码是否正确。免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。