Java IO

  1. Java提供了哪些IO方式?
  2. NIO如何实现多路复用?
  3. Java有几种文件拷贝方式?哪种最高效?

如何正确使用getResourceAsStream()这个函数获取一些配置文件?

getResourceAsStream(String path)这个函数的参数是一个路径,但是这个路径应该怎么填?使用该函数的难点也就在此。

记住一个关键点:

getResourceAsStream这个函数寻找文件的起点是JAVA项目编译之后的根目录。

比如一般maven项目编译之后根目录都是target/classes这个目录,即classpath 为 target/classes
该目录下的文件结构,就是打包之后jar包中的文件结构

先总结:

  1. 使用 Class对象调用时, 区分 相对路径 & 绝对路径
    Class.getResourceAsStream(String path) : path 不以’/‘开头时(即为相对路径)默认是以当前类所在位置, 以相对路径的形式寻找资源文件,以’/‘开头(即为绝对路径)则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
  2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/‘开头,最终是由ClassLoader获取资源。
  3. Class 类调用, 实际逻辑和 classLoader 一样, 只不过在开始前, 加了一个函数: resolveName, 处理了绝对路径和相对路径 最终底层和 classLoader 调用的函数一致: getBootstrapResource

举例说明:

比如下面这个目录树就是一个maven项目编译之后的文件分布情况:

1
2
3
4
5
6
7
├── com
│ ├── spoon
│ │ └── test
│ │ └── TestConstants.class
├── config
│ └── config2.properties
└── config.properties

问题:在TestGetResourceAsStream.class这个类中应该怎么获取config.properties和config2.properties这两个文件呢?

方法1.
使用Class.getResourceAsStream()
config这个文件的路径是/config.properties(/表示根目录),config2.properties这个文件的路径是/config/config2.properties,所以我们可以使用下面的代码获取这两个文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 绝对路径的方式
@Test
public void getResourceClassAndFileInSamePackage() throws IOException {
// 获取config2.properties
InputStream config2 = this.getClass().getResourceAsStream("/config/config2.properties");

// 获取config.properties
InputStream config = this.getClass().getResourceAsStream("/config.properties");
}

// 相对路径的方式
@Test
public void getResourceClassAndFileInSamePackage() throws IOException {
// 获取config2.properties
InputStream config2 = this.getClass().getResourceAsStream("../../../config/config2.properties");

// 获取config.properties
InputStream config = this.getClass().getResourceAsStream("../../../config.properties");
}

方法2.
使用Class.getClassLoader().getResourceAsStream(String path)
因为该方法默认使用的是classpath的根目录,所以路径前不能添加/

1
2
3
4
5
6
7
8
@Test
public void getResourceClassAndFileInSamePackage() throws IOException {
// 获取config2.properties
InputStream config2 = this.getClass().getClassLoader().getResourceAsStream("config/config2.properties");

// 获取config.properties
InputStream config = this.getClass().getClassLoader().getResourceAsStream("config.properties");
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 ligongzhao
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信