java读取resources下的配置文件+文件相对路径小结

本文详细介绍了在Java中使用Properties与ResourceBundle类进行文件读取的方法,包括字符流与字节流读取,以及如何正确处理中文编码。同时,文章还探讨了多种文件路径的指定方式,如绝对路径、相对路径等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.文件读取

1.利用java.util自带的Properties类读取

Properties类的load方法提供了两种读取文件的方式

(1)reader作为参数,以字符流方式读取

Properties properties = new Properties();
try {
    properties.load(new InputStreamReader(new FileInputStream(fileName),"utf-8"));
} catch (IOException e) {
    e.printStackTrace();
}
String url = properties.getProperty("url")

在load参数里面可以用任意的io装饰类去装饰文件输入流,只要最终装饰成字符流即可;InputStreamReader方法有编码参数,若读取含有中文的文件,文本文件默认编码为ANSI(在windows中就是GBK),所以将编码参数设置为GBK;或者我的idea系统设置为utf-8编码,所以只要先将文件转为utf-8编码即可

(2)inputStream作为参数,以字节流方式读取

Properties properties = new Properties();
try {
    properties.load(new FileInputStream(fileName));
} catch (IOException e) {
    e.printStackTrace();
}

String url = properties.getProperty("url")

同理,load方法参数可以添加任意的装饰组件

2.利用java.util自带的ResourceBundle类读取

ResourceBundle bundle = ResourceBundle.getBundle("config");
String url = bundle.getString("url");

该方法默认读取的是resources文件夹下的以.properties为后缀的文件,代码中的例子即为config.properties

二.文件路径

有几种方式

1.绝对路径,不赘述

2.相对路径

(1)利用System.getProperty方法

System.getProperty("user.dir")+"/src/main/resources/config.properties"

System.getProperty("user.dir")会定位到项目的根目录,可以得到该工程项目所有文件的相关路径及环境配置信息
(2)利用类装载器

String fileName = this.getClass().getClassLoader().getResource("config.properties").getPath();
InputStream in = this.getClass().getClassLoader().getResourceAsStream("config.properties");

二者都定位到的是编译过后class文件所在同级目录下的配置文件。前者可以获取文件完整路径,然后通过reader字符流读取文件,对应于上述properties类load方法中的(1),后者可以直接作为字节流参数输入load方法对应(2)

(3)默认

properties.load(new InputStreamReader(new FileInputStream("config.properties")));

默认定位从项目根目录开始,上面例子读取的是项目根目录下的config.properties文件

<think>好的,我需要帮助用户了解如何在Java中向resources目录下的文件写入数据。首先,用户可能不太清楚resources目录的结构和作用,尤其是在Maven或Gradle项目中的标准位置。需要先解释为什么直接写入resources目录可能有问题。 根据用户提供的引用内容,Java写入文件通常使用FileWriter、BufferedWriter、Files类或FileOutputStream。但resources目录通常是用于存放只读资源,比如配置文件,这些文件会被打包到JAR或WAR中,运行时可能位于类路径下,无法直接修改。因此,直接写入resources目录在部署后可能不可行,应该考虑其他路径,比如项目根目录或系统临时目录。 接下来,用户需要一个示例,可能需要分两种情况:开发时和运行时。开发时,可以通过指定路径写入,但需要注意路径的正确性。运行时,如果资源文件在JAR内,无法修改,应该将文件写入外部目录。 需要确保示例代码正确,使用正确的类和方法,比如使用Files.write或FileOutputStream,并处理异常。同时,要提醒用户资源文件通常为只读,建议写入其他目录,并提供替代方案。 检查引用内容,引用[1]提到FileWriter、BufferedWriter、Files和FileOutputStream。引用[2]和[3]也提到类似的类。因此,示例代码应使用这些类,并正确关闭资源。 最后,生成相关问题,可能涉及资源目录的特性、读取资源文件的方法、替代写入方案以及打包后的处理。确保问题相关且有帮助。</think>在Java中向`resources`目录写入文件需要注意其特殊性质:**该目录通常作为只读资源目录存在,打包后文件会被封装在JAR/WAR中,运行时无法直接修改**[^1]。若需动态写入文件,建议将目标路径指向其他可写目录。以下是两种场景的解决方案: --- ### 一、开发环境写入示例(不推荐生产使用) 若需在开发阶段向`src/main/resources`写入文件,可通过绝对路径实现: ```java import java.nio.file.Files; import java.nio.file.Paths; import java.io.IOException; public class ResourceWriter { public static void writeToResource() throws IOException { String content = "Hello, Resources!"; // 获取项目根目录 + 资源路径 String resourcePath = System.getProperty("user.dir") + "/src/main/resources/test.txt"; Files.write(Paths.get(resourcePath), content.getBytes()); } } ``` --- ### 二、生产环境推荐方案 更安全的做法是将文件写入外部目录(如项目根目录、临时目录): ```java import java.nio.file.Files; import java.nio.file.Paths; public class SafeFileWriter { public static void writeToExternal() throws IOException { String content = "External Data"; // 写入项目根目录下的output文件Files.createDirectories(Paths.get("output")); // 创建目录 Files.write(Paths.get("output/data.txt"), content.getBytes()); } } ``` --- ### 关键注意事项 1. **资源目录只读性**:JAR内的资源文件通过`getResource()`获取的是只读流,无法直接修改[^2] 2. **路径差异问题**:开发时`src/main/resources`与打包后资源路径结构不同 3. **替代方案**: - 将配置文件模板复制到可写目录后再修改 - 使用数据库或外部存储系统保存动态数据[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值