Hexo

Java中的资源访问问题

2019-04-12

Java 中资源访问其实是一件很常见的事,不过因为自己懒/忙,从来都没有整理过。趁着最近比较清闲,把这块的东西整理下。

概论

首先比较重要的是,不要直接使用绝对路径去定位资源。绝对路径定位会导致很多问题,比如程序移动到新的机器上之后就需要改代码,是非常不利于部署的。

使用内置 API 来访问资源,往往是从某一个位置出发,通过相对路径去查找。

常见方式

下面列举最常用到的几个出发点:

classpath

如果要找的资源在classpath之下,使用该位置作为出发点比较方便。
一般来说是通过ClassLoader.getResource(String name)来实现的(name表示相对路径)。
获取ClassLoader的方法:

  • Thread.currentThread().getContextClassLoader()
  • XX.class.getClassLoader()
  • ClassLoader.getSystemClassLoader()
    ClassLoaderresource的过程和加载类的过程基本一致,也是双亲委派模型。如果父加载器没有找到资源,那么就调用findResource方法去找。自定义类加载器可以覆盖该方法,实现自定义的资源查找。

类字节码路径

要找的资源和某个类放在一起的时候,可以用这种方式。通过XX.class.getResource/getResourceAsStream来获取资源。

当前用户目录

一般说来,当前用户目录就是项目的根路径(不过对于 JavaEE 服务器来说,结果可能略有不同),不过没有统一的规范。获取当前用户目录的方法:System.getProperty("user.dir")。默认情况下,IO 包中的类总是根据当前用户目录来分析相对路径名,比如new File("xxx"),就是在System.getProperty("user.dir")下寻找xxx文件。

Web 应用程序根目录

在 Web 应用程序中,一般通过ServletContext.getRealPath("/")获得 Web 应用程序根目录的绝对路径。

Tags: Java

扫描二维码,分享此文章