从JAR获取文件

时间:2010-08-10 08:39:42

标签: java spring resources io

我正在使用Spring的Resource抽象来处理文件系统中的资源(文件)。其中一个资源是JAR文件中的文件。根据以下代码,似乎引用有效

ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();

// The path to the resource from the root of the JAR file
Resource fileInJar = resourcePatternResolver.getResources("/META-INF/foo/file.txt");

templateResource.exists(); // returns true
templateResource.isReadable();  // returns true

此时一切顺利,但是当我尝试将Resource转换为File

templateResource.getFile();

我得到了例外

java.io.FileNotFoundException: class path resource [META-INF/foo/file.txt] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/m2repo/uic-3.2.6-0.jar!/META-INF/foo/file.txt        
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:198)
at org.springframework.core.io.ClassPathResource.getFile(ClassPathResource.java:174)

获取JAR文件中存在的File的{​​{1}}引用的正确方法是什么?

4 个答案:

答案 0 :(得分:18)

  

获取文件的正确方法是什么   引用存在的资源   在JAR文件中?

正确的方法是不要这样做,因为这是不可能的。 File表示文件系统上的实际文件,而JAR条目不是,除非您有特殊的文件系统。

如果您只需要数据,请使用getInputStream()。如果您必须满足需要File对象的API,那么我担心您唯一能做的就是创建一个临时文件并将输入流中的数据复制到它。

答案 1 :(得分:4)

如果您想阅读,请致电resource.getInputStream()

异常消息非常清楚 - 文件不驻留在文件系统上,因此您不能拥有File实例。除此之外 - 除了阅读其内容之外,将会对File做些什么呢?

答案 2 :(得分:-1)

快速查看您为资源文档提供的link,说明如下:

Throws: IOException if the resource cannot be resolved as absolute file path, 
i.e. if the resource is not available in a file system

也许文本文件在jar中?在这种情况下,您必须使用getInputStream()来阅读其内容。

答案 3 :(得分:-1)

这里只是为答案添加一个例子。如果您需要在JAR中使用 mFragmentToolbar = (Toolbar) layout.findViewById(R.id.toolbar2); mFragmentToolbar.inflateMenu(/*your menu resource file*/); mFragmentToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return false; } }); (而不仅仅是其中的内容),则需要首先从资源创建临时文件。 (以下是用Groovy编写的):

File