先看项目截图
public class FileTest {
public static void main(String[]args) throws IOException {
String path = Objects.requireNonNull(FileTest.class.getClassLoader().getResource("config/First.xml")).getPath();
System.out.println(path);
System.out.println("***********");
String result = FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8);
System.out.println(result);
}
}
文件放在resources目录下,用上面的方式就能读。
那如果文件放到src目录下呢?
比较麻烦
为什么?因为我们知道java的运行是把后缀名为java的文件进行编译,编译成.class文件, 然后统一放到/Users/dongleifeng/IdeaProjects/parent_pro/spring_boot/target/classes/ 下面这个位置
我们可以看到target下有两个文件夹一个classes和一个test-classes
如上图所示,我用的ide是idea,idea默认只把
src/main/java 下的后缀名为.java的文件进行了编译,复制到classes文件夹
src/main/resources 下的所有配置文件复制到classes文件夹
还有test下面的对应文件复制到test-classes
加入你把配置文件放到src下面,最终咱们的业务逻辑是在classes文件夹里开始的,那自然就没法感知到原来的src/main/java下面的配置文件了。
怎么办,既然知道了为什么访问不到文件,那想办法让idea把src下面的非java文件也复制到target/classes下面不就OK了?
解决方案见:
https://blog.csdn.net/shifangwannian/article/details/48882201
但是我觉得不好,最好的方式依然是把配置文件放到resources目录下
人家规范都定好了
src下面是源文件
resources下是配置文件
为啥要打破这个规则呢?
另外再附一个读取properties文件的方式
pom如下:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-configuration2</artifactId>
<version>2.8.0</version>
</dependency>
<!-- commons-configuration2 的实现需要依赖commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
代码如下:
package com.alibaba;
import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.builder.fluent.Configurations;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Properties;
public class FileTest {
public static void main(String[]args) throws IOException, ConfigurationException {
// 通过FileInputStreamm获取文件流
String propPath = FileTest.class.getClassLoader().getResource("config/myProp.properties").getPath();
Properties properties2 = new Properties();
properties2.load(new FileInputStream(propPath));
System.out.println("22222222222----> "+properties2.getProperty("my_key"));
System.out.println("22222222222----> "+properties2.getProperty("my_other_key"));
// 通过PropertiesConfiguration
// PropertiesConfiguration 会去掉value前后的空格
PropertiesConfiguration propertiesConfiguration = new Configurations().properties(propPath);
System.out.println("333----> "+propertiesConfiguration.getString("my_key"));
System.out.println("333----> "+propertiesConfiguration.getLong("password"));
}
}