黑马程序员技术交流社区

标题: [石家庄校区]如何读取ClassPath下的资源 [打印本页]

作者: 欢迎光临    时间: 2017-9-29 09:44
标题: [石家庄校区]如何读取ClassPath下的资源
本帖最后由 欢迎光临 于 2018-3-8 17:05 编辑

由于获取类路径下的资源文件的都是基于URL的,因此这里需要先讲述一下URL的概念。URL(Uniform Resource Locator)即统一资源定位器,指向互联网资源的指针,是一种具体的资源。其一般的形式,如:

[Java] 纯文本查看 复制代码
scheme:[//host][:port][path][?query][#fragment]

scheme包括:http、https、file、jar等。一个例子:file:/User/root/test.jar?time=123431212, 其中:schema为file,path为/root/test.jar, query为time=123431212。
这里需要区分URL和URI。URI, Uniform Resource Identifier,统一资源标识符,用来唯一的标识一个资源。其一般形式:

[Java] 纯文本查看 复制代码
[scheme:][//authority][path][?query][#fragment]

其中,authority为[user-info@]host[:port]
可见,URL是一种具体的URI,只不过其scheme是非空的,它不仅仅标识一个资源,也能定位一个资源(即通过url能够访问到这个资源),因此其必须是绝对地址,即使是相对url,其本质也是相对于某绝对url来讲的,也是一个绝对地址。而URI可以是绝对的也可以是相对的,只要能够标识即可。
此外,URL和URI的不同之处还在于前者不提供对标准RFC2396规定的特殊字符的转义,因此需要调用者自己对URL各组成部分进行encode。而java.net.URI则会提供转义功能。这两者可以通过URI.toURL()和URL.toURI()来互相转换。
这里需要指出的是,如果是想直接读取类路径下的资源的内容,那么使用下面的方法是万能的。

[Java] 纯文本查看 复制代码
ClassLoader.getResourceAsStream(String classpathRecourcePath)

需要注意的是有时候jar包中的类并非和你应用的类使用的是同一类加载器(写intellij插件的时候就会存在这种问题),这时候需要选择对应的ClassLoader。
此外,有些场景是需要获取到类路径下的资源路径信息的,可以选用以下三种方法:
还需要提到的一点是:当你想使用File类来处理scheme为file的资源时,可以使用URL的getFile方法获取其path和query信息(URL的getPath方法返回的仅仅包含path部分)。但如果你的资源是位于jar包中的,那么获取到的URL信息是以jar:file开头的,并不能用此方式处理。


节选自ImportNew





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2