Java 中资源访问其实是一件很常见的事,不过因为自己懒/忙,从来都没有整理过。趁着最近比较清闲,把这块的东西整理下。
概论
首先比较重要的是,不要直接使用绝对路径去定位资源。绝对路径定位会导致很多问题,比如程序移动到新的机器上之后就需要改代码,是非常不利于部署的。
使用内置 API 来访问资源,往往是从某一个位置出发,通过相对路径去查找。
常见方式
下面列举最常用到的几个出发点:
classpath
如果要找的资源在classpath
之下,使用该位置作为出发点比较方便。
一般来说是通过ClassLoader.getResource(String name)
来实现的(name
表示相对路径)。
获取ClassLoader的方法:
Thread.currentThread().getContextClassLoader()
XX.class.getClassLoader()
ClassLoader.getSystemClassLoader()
ClassLoader
找resource
的过程和加载类的过程基本一致,也是双亲委派模型。如果父加载器没有找到资源,那么就调用findResource
方法去找。自定义类加载器可以覆盖该方法,实现自定义的资源查找。
类字节码路径
要找的资源和某个类放在一起的时候,可以用这种方式。通过XX.class.getResource/getResourceAsStream
来获取资源。
当前用户目录
一般说来,当前用户目录就是项目的根路径(不过对于 JavaEE 服务器来说,结果可能略有不同),不过没有统一的规范。获取当前用户目录的方法:System.getProperty("user.dir")
。默认情况下,IO 包中的类总是根据当前用户目录来分析相对路径名,比如new File("xxx")
,就是在System.getProperty("user.dir")
下寻找xxx
文件。
Web 应用程序根目录
在 Web 应用程序中,一般通过ServletContext.getRealPath("/")
获得 Web 应用程序根目录的绝对路径。
扫描二维码,分享此文章