精华帖 (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多时间,才发现时文件名大小写问题。。。差点崩溃 |
|
返回顶楼 | |
发表时间:2009-10-09
downpour 写道 XWork中有个工具类,叫做ClassLoaderUtil,可以深入读取jar包中的资源文件。Struts2就是用这个工具类读取所有的plugin中的struts-default.xml的。
原理应该和楼主的一样。所以不得不赞叹很多前人的工作,当我们碰到难题时,其实很多前人已经总结了很多最佳实践了。 实实在在地站在巨人肩膀上 |
|
返回顶楼 | |
发表时间:2009-10-09
受教了受教了
|
|
返回顶楼 | |
发表时间:2009-10-09
这个类一下就可以搞定:java.util.jar.JarFile
|
|
返回顶楼 | |
发表时间: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 类名呢? |
|
返回顶楼 | |
发表时间:2009-10-09
其实和从哪个路径读文件 没什么区别 只是中问问题罢了
|
|
返回顶楼 | |
发表时间: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的方法很多。这张贴有很多好心人回复了不少方法,谢谢大家了! |
|
返回顶楼 | |
发表时间: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作为参数的,哈哈 |
|
返回顶楼 | |
发表时间:2009-10-09
spring jsf 不都有这个功能
阿里软件的 邱文初的 blog也写过遇到这个问题 不过还是 感谢 lz的 研究精神 |
|
返回顶楼 | |
发表时间: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方法获得到类路径下的资源文件。在类路径中,我们是把它看作文件夹的。 |
|
返回顶楼 | |