论坛首页 Java企业应用论坛

【解惑】深入jar包:从jar包中读取资源文件

浏览 112239 次
精华帖 (4) :: 良好帖 (15) :: 新手帖 (9) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-10-10   最后修改:2009-10-10
pipilu 写道
Heart.X.Raid 写道
pipilu 写道
引用


这主要是因为jar包是一个单独的文件而非文件夹,绝对不可能通过"file:/e:/.../ResourceJar.jar/resource

/res.txt"这种形式的文件URL来定位res.txt。所以即使是相对路径,也无法定位到jar文件内的txt文件(读者也许对这段原因解释有些费解,在下面我们会用一段代码运行的结果来进一步阐述)。


这里说的不对吧!
jar包不是文件,而是一个文件夹

如果你的说法成立
引用
jar包是一个单独的文件而非文件夹
,那么,我们写类路径时,就不用把jar包的文件名写到类路径里了,假设你依赖的jar包在程序执行路径下,那就直接写成:
java -classpath . 类名
就可以了,何必要写成:
java -classpath .;xxx.jar;yyy.jar;zzz.jar 类名
呢?



我绝对jar包是一种特殊的文件,如果说是文件夹的话,试问.rar文件算文件夹还是文件那?
其实我绝对就是URL解析的问题,jar包有自己的URL,不同于File的URL,所以不能简单的File f=new File(url);来访问。可能我的解释有些不准确,但我想说的原因不是jar是什么,而是访问jar中资源的特殊之处。

从这个意义上说,楼上的兄弟说的也挺在理的。

当然,访问jar的方法很多。这张贴有很多好心人回复了不少方法,谢谢大家了!


我强调这一点的原因在于,正是因为jar包是作为一个文件夹引入类路径的,才有之后的getResourceAsStream方法获得到类路径下的资源文件。在类路径中,我们是把它看作文件夹的。


你之所以能以目录形式访问jar包中的资源 是因为java可以解析路径 并映射到相关文件中的Entry
就好像你可以以表的形式访问数据库 可实际上表真的是以表的形式存放吗??

你这种说法是在误导初学者
1 请登录后投票
   发表时间:2009-10-10  
thx so much.
0 请登录后投票
   发表时间:2009-10-10  
mallon 写道
admires 写道
读取jar文件中的文件,用类加载器,亦可以读取到文件。URL中有一个getFile()方法。
File f = new File(URL.getFile());
这样就可以了。但是带来的问题是URL的路径中不支持文件夹包含空格(用%20代替了),如果要使用,需要再次转义。
虽然新的URI支持空格。但是URL.toURI().getPath()却不能够作为参数new出一个File对象。


我也碰到过,不过new File(url.getFile()); 改成new File(url.toURI())很完美,File的构造函数支持以URI作为参数的,哈哈


后来也有尝试过用URI作为参数构造File对象。但如果这个文件是存在于jar包中,也是不可以的
在数次尝试之后发现可以用url.toURI().getSchemeSpecificPart()作为参数来构造File对象。
这样可以避免路径文件夹中有空格,或者汉字。
官方文档中对于getSchemeSpecificPart()方法的说明是:
Returns the decoded scheme-specific part of this URI
而对于getPath()
Returns the decoded path component of this URI
以上为人肉测试结果。
0 请登录后投票
   发表时间:2009-10-10  
受教了,能少走弯路了!
0 请登录后投票
   发表时间:2009-10-11  
收藏了,以前也一直碰到这样都问题,我是直接把资源文件暴露在jar包外面然后调用的!!
0 请登录后投票
   发表时间:2009-10-12  
这样的方式,在动态热部署中,依然无法读取jar类的东西。
并且错误很怪异。
上半年遇到的问题。
最后改用zip流读入了
0 请登录后投票
   发表时间:2009-10-12  
虽然没碰到过这样的问题,但是今天受教了
0 请登录后投票
   发表时间:2009-11-12  
这个问题我遇到过,后来看了一下 java security才明白,jvm 在加载了jar包后,所有的资源访问都是通过java的安全机制的,就像你在本地pc上启动了一个虚拟系统,然后在虚拟系统中要来访问你本地pc的文件是不行的。所有只能通过java 类加载机制来寻找文件。
0 请登录后投票
   发表时间:2009-12-10  
思考一个问题:执行下面一个命令
java -jar xxx.jar
是否有方法可以拿到java -jar执行时,解析xxx.jar的JarFile对象呢?
深入了解jvm...
0 请登录后投票
   发表时间:2009-12-10  
呵呵,不错,以前我老师这么讲过,可是我忘了,现在又复习了一下,彻底的明白了,
谢了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics