JAVA问题解决——Jar包中资源调用

我在打包工程的时候,遇到在IDE中能够运行但jar包运行错误的情况(FileNotFoundException)。
在网上找的很多解决方法都是需要使用getResouce方法获取绝对路径,或者必须先把文件读入才能继续操作。
使用getRescource仍然有上述错误;而要读取的文件是一个需要和前端交互,要在文件上进行操作的文件,必须保证文件原格式不变。所以读入再操作的方法并不适合,因为再输出时格式控制等会十分麻烦。
下面是一些解决问题中学习到的内容:
i.
jar包是一个文件,我的理解是,jar包内部有一个自己的文件系统(它会在文件特定路径上加一个!,即会出现*!/*这样的形式),而在jar包内使用相对或绝对路径其实调用的都是机器上的FileSystem,路径和jar包中的不匹配,因此想要以这个路径在jar包中获取文件是不可行的。
(这让我产生了另一个疑问,那网上的getResource()方法传入的路径是怎么解析的)
疑问解答:
如果只是路径,jar包是可以获取的,而且还是绝对路径(/static/config.xml),jar包内部是可以获取到的(虽然不知道为什么),但是如果要调用
Resource resource = new ClassPathResource(path);
File file = resource.getFile();
这个时候是不可以的。
我认为是因为调用了File,是机器上的文件系统,而files输出也是file:/C:/****的路径,和jar包内路径是不符合的,因此jar包无法通过file来找到文件。
ii.
这次之所以要使用文件路径,是因为调用了一个DocumentBuidler.parse()方法,一开始是传入了一个File类型的参数,而新建File又使用了路径,问题迟迟不能解决就查看了源代码,发现parse方法可以重载:
 
// 下面是4个重载的parse函数
public Document parse(InputStream is){...}

public Document parse(InputStream is,String SystemId){...}

public Document parse(String uri){...}

public Document parse(File f) throws SAXException, IOException{...}

然后!就发现可以直接传URI!就用了下面的方法:
/** 
* doc 是Document的实例
* db是DocumentBuilder实例
* path是资源文件的绝对路径
*/
doc = db.parse(this.getClass().getResource(path).toString());
然后就成了!!
posted @ 2017-09-03 13:26  Morale_U  阅读(608)  评论(0编辑  收藏  举报