论坛首页 Java企业应用论坛

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

浏览 112240 次
精华帖 (4) :: 良好帖 (15) :: 新手帖 (9) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-10-09  
Heart.X.Raid 写道
     这个jar包搞死我了,昨天搞清楚jar包中资源URL的形式以及读法。今天写了个程序突然发现源代码可以读,但打入jar包后就不行了。最后花了我2个多小时才搞明白为什么:

      原来我的资源文件名是 BigramDict.dct
      但是我在源代码里面写成了:/ICTCLAS_DICT/bigramDict.dct (首字母小写了)

      本来这是个小问题,但是源代码
         InputStream is=this.getClass().getResourceAsStream("/ICTCLAS_DICT/bigramDict.dct");
      运行的时候是可以找到BigramDict.dct的。一旦把 BigramDict.dct打入jar包,就找不到了。
   
       jar包里面的文件要分大小写的,但找外面的文件名可以不分,哭死我了。

       我想骂..骂..骂..骂..骂...娘....


这个问题我也遇到过。。。浪费了我N多时间,才发现时文件名大小写问题。。。差点崩溃
0 请登录后投票
   发表时间:2009-10-09  
downpour 写道
XWork中有个工具类,叫做ClassLoaderUtil,可以深入读取jar包中的资源文件。Struts2就是用这个工具类读取所有的plugin中的struts-default.xml的。

原理应该和楼主的一样。所以不得不赞叹很多前人的工作,当我们碰到难题时,其实很多前人已经总结了很多最佳实践了。


实实在在地站在巨人肩膀上
0 请登录后投票
   发表时间:2009-10-09  
受教了受教了
0 请登录后投票
   发表时间:2009-10-09  
   这个类一下就可以搞定:java.util.jar.JarFile
0 请登录后投票
   发表时间:2009-10-09   最后修改:2009-10-09
引用


这主要是因为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 类名
呢?
0 请登录后投票
   发表时间:2009-10-09  
其实和从哪个路径读文件 没什么区别 只是中问问题罢了
0 请登录后投票
   发表时间:2009-10-09  
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的方法很多。这张贴有很多好心人回复了不少方法,谢谢大家了!
0 请登录后投票
   发表时间:2009-10-09   最后修改:2009-10-09
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作为参数的,哈哈
0 请登录后投票
   发表时间:2009-10-09  
spring  jsf 不都有这个功能

阿里软件的 邱文初的 blog也写过遇到这个问题

不过还是 感谢 lz的 研究精神
0 请登录后投票
   发表时间:2009-10-10  
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方法获得到类路径下的资源文件。在类路径中,我们是把它看作文件夹的。
0 请登录后投票
论坛首页 Java企业应用版

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