Java 读取配置文件路径与中文乱码问题全解析 📅 2026/7/24 12:19:40 1. 引言在 Java 开发中读取配置文件如.properties、.yml、.xml是家常便饭。然而两个经典问题常常困扰着开发者配置文件路径问题明明文件就在项目里程序却报FileNotFoundException。中文乱码问题配置文件里写了中文注释或值读取出来却是一堆???或乱码。本文将深入剖析这两个问题的根源并提供一套标准、可靠的解决方案。2. 配置文件路径问题2.1 路径分类Java 读取文件时路径主要分为两类绝对路径从盘符或根目录开始的完整路径如D:/config/app.properties。可移植性差不推荐在项目中使用。相对路径相对于程序当前工作目录user.dir的路径。在 IDE 中运行和命令行打包运行时工作目录可能不同容易出错。2.2 推荐方案从 classpath 读取最稳妥的方式是将配置文件放在resources目录下即 classpath 的根路径然后通过类加载器读取。项目结构示例src/ └── main/ ├── java/ │ └── com/example/Demo.java └── resources/ └── config.properties核心代码importjava.io.InputStream;importjava.util.Properties;publicclassConfigReader{publicstaticPropertiesloadProperties(StringfileName){PropertiespropsnewProperties();// 使用当前线程的类加载器获取资源流try(InputStreaminputThread.currentThread().getContextClassLoader().getResourceAsStream(fileName)){if(inputnull){System.out.println(抱歉未在 classpath 中找到文件: fileName);returnprops;}props.load(input);}catch(Exceptione){e.printStackTrace();}returnprops;}publicstaticvoidmain(String[]args){PropertiespropsloadProperties(config.properties);System.out.println(props.getProperty(app.name));}}关键点getResourceAsStream()方法会自动从 classpath 的根路径开始查找文件。打包成 JAR 后resources目录下的文件会被打包进 JAR 内部上述代码依然有效。2.3 获取文件的其他方式Class.getResourceAsStream()路径以/开头表示从 classpath 根路径查找否则相对于该类所在的包路径。ClassLoader.getSystemResourceAsStream()使用系统类加载器在某些 Web 容器中可能失效不推荐。3. 中文乱码问题3.1 乱码根源Properties类的load()方法默认使用ISO-8859-1 (Latin-1)字符编码读取文件。ISO-8859-1 不支持中文字符因此直接读取包含中文的.properties文件必然出现乱码。3.2 解决方案方案一使用 UTF-8 编码读取推荐从 Java 9 开始Properties类提供了load(Reader reader)方法允许我们指定字符编码。importjava.io.InputStreamReader;importjava.nio.charset.StandardCharsets;publicstaticPropertiesloadPropertiesUtf8(StringfileName){PropertiespropsnewProperties();try(InputStreaminputThread.currentThread().getContextClassLoader().getResourceAsStream(fileName);InputStreamReaderreadernewInputStreamReader(input,StandardCharsets.UTF_8)){if(inputnull){System.out.println(文件未找到: fileName);returnprops;}props.load(reader);}catch(Exceptione){e.printStackTrace();}returnprops;}方案二使用 native2ascii 转码传统方案在 Java 8 及更早版本中或需要兼容老旧系统时可以使用 JDK 自带的native2ascii工具将中文转换为 Unicode 转义序列。转换前config.propertiesapp.name应用名称转换后config.propertiesapp.name\u5E94\u7528\u540D\u79F0转换命令native2ascii-encodingUTF-8 src.properties dst.properties方案三使用 Yaml 或 JSON 配置文件YAML 和 JSON 格式原生支持 UTF-8 编码不存在Properties类的编码问题。配合 Spring Boot 等框架使用非常方便。application.yml 示例app:name:应用名称version:1.0.04. 完整示例与最佳实践4.1 工具类封装将上述最佳实践封装成一个工具类方便复用importjava.io.*;importjava.nio.charset.StandardCharsets;importjava.util.Properties;publicclassPropertiesUtil{/** * 从 classpath 加载 properties 文件UTF-8 编码 * * param fileName 文件名如 config.properties * return Properties 对象 */publicstaticPropertiesload(StringfileName){PropertiespropsnewProperties();try(InputStreaminputPropertiesUtil.class.getClassLoader().getResourceAsStream(fileName)){if(inputnull){thrownewFileNotFoundException(配置文件 fileName 未在 classpath 中找到。);}// 使用 InputStreamReader 指定 UTF-8 编码try(ReaderreadernewInputStreamReader(input,StandardCharsets.UTF_8)){props.load(reader);}}catch(IOExceptione){System.err.println(加载配置文件失败: e.getMessage());}returnprops;}publicstaticvoidmain(String[]args){PropertiespropsPropertiesUtil.load(config.properties);Stringnameprops.getProperty(app.name,默认值);System.out.println(应用名称: name);}}4.2 常见问题排查文件未找到确认文件确实在src/main/resources/目录下检查文件名大小写Linux 系统区分大小写。IDE 中正常打包 JAR 后报错确保构建工具Maven/Gradle已将resources目录下的文件包含在打包配置中。读取到null检查properties文件中的键名是否拼写正确或使用getProperty(key, defaultValue)提供默认值。5. 总结路径问题优先使用ClassLoader.getResourceAsStream()从 classpath 读取避免使用相对路径。乱码问题使用InputStreamReader指定UTF-8编码读取.properties文件或改用 YAML/JSON 格式。最佳实践将配置读取逻辑封装成工具类统一管理提高代码的可维护性。掌握以上技巧你就能轻松应对 Java 配置文件读取中的路径和乱码问题了。