Java 如何从spring资源中获取文件

Java 如何从spring资源中获取文件,java,spring,Java,Spring,我有一个资源对象(org.springframework.core.io.ClassPathResource)。我需要获取File对象,但是resource.getFile()抛出一个未找到的exeption文件。但是在调用resource.getURI()之后,我得到了一个结果 jar:file:/D: .... file.jar!/com//test/0be14958-3778-40bf-bd3e-ee605fcdd3f0/verify 目录位于jar文件中。是否可以绕过ClassPath

我有一个资源对象(org.springframework.core.io.ClassPathResource)。我需要获取File对象,但是
resource.getFile(
)抛出一个未找到的exeption文件。但是在调用
resource.getURI()
之后,我得到了一个结果

jar:file:/D: .... file.jar!/com//test/0be14958-3778-40bf-bd3e-ee605fcdd3f0/verify
目录位于jar文件中。是否可以绕过ClassPathResource的限制并创建文件对象

我尝试了一个新文件(resource.getURI()),但在java.lang.IllegalArgumentException中失败:URI不是分层的


我的错是什么?

我认为不可能从JAR中的某个东西中获取java.io.File(因为它实际上不是一个文件)。从ClassPathResource JavaDoc:

如果类路径资源位于文件系统中,则支持解析为
java.io.File
,但不支持解析为JAR中的资源

您没有提到为什么需要它作为java.io.File,但是您可以重构代码以使用ClassPathResource.getInputStream方法(它使您能够读取资源)

或者您也可以使用ClassPathResource.getInputStream将您想要的文件复制到文件系统上的临时文件,然后将其用作直接的java.io.file

File temp = File.createTempFile("temp", ".tmp");
org.apache.commons.io.IOUtils.copy(resource.getInputStream(), new FileOutputStream(temp));

我认为不可能从JAR中的东西中获取java.io.File(因为它实际上不是一个文件)。从ClassPathResource JavaDoc:

如果类路径资源位于文件系统中,则支持解析为
java.io.File
,但不支持解析为JAR中的资源

您没有提到为什么需要它作为java.io.File,但是您可以重构代码以使用ClassPathResource.getInputStream方法(它使您能够读取资源)

或者您也可以使用ClassPathResource.getInputStream将您想要的文件复制到文件系统上的临时文件,然后将其用作直接的java.io.file

File temp = File.createTempFile("temp", ".tmp");
org.apache.commons.io.IOUtils.copy(resource.getInputStream(), new FileOutputStream(temp));

我需要文件来调用list()方法来获取其中子目录的名称。对象resource.getInputStream()和新的FileOutputStream(temp)都不是null。啊。。。我所说的应该适用于JAR中的文件,但不适用于目录。如果您需要在JAR中列出目录的内容,您可能需要采用不同的方法。JAR文件只是一个普通的zip文件,因此您可以从getURI(在“!”之前的部分)解析到它的路径,并按说明打开它。您可能会发现它很有用。-顺便说一句,这也是一个如何使用正确的唯一临时文件名的示例,例如在Mifos的“我需要文件来调用list()方法”中获取其中的子目录名。不幸的是,我在org.apache.commons.io.IOUtils.copy上获得了NPE。对象resource.getInputStream()和新的FileOutputStream(temp)都不是null。啊。。。我所说的应该适用于JAR中的文件,但不适用于目录。如果您需要在JAR中列出目录的内容,您可能需要采用不同的方法。JAR文件只是一个普通的zip文件,因此您可以从getURI(在“!”之前的部分)解析到它的路径,并按说明打开它。您可能会发现它很有用。-顺便说一句,这也是一个如何使用正确的唯一临时文件名的示例,例如在Mifos的