2017-06-05 67 views
0

我尝试从我的应用程序读取资源文件,但它不起作用。Java获取资源不起作用

代码:

文件:/ C:/Users/username/Repo/run/Application.jar /test.xsd当我执行的jar文件

String filename = getClass().getClassLoader().getResource("test.xsd").getFile(); 
System.out.println(filename); 
File file = new File(filename); 
System.out.println(file.exists()); 

输出

,当我从运行的IntelliJ应用程序,但不是当我执行的jar文件它的工作原理。如果我用7-zip打开我的jar文件,test.xsd位于根文件夹中。为什么执行jar文件时代码不工作?

+0

尝试移动“test.xsd”入类文件夹。如你所见,你调用getClassLoader()来搜索类路径中的文件。 –

+0

你可以检查jar的内容,你的文件是否打包到jar中 –

+0

IntelliJ可能已经添加了你的根文件夹作为类路径 –

回答

1

另外,File是指实际的OS文件系统文件;在操作系统的文件系统中,只有一个jar文件,该jar文件不是文件夹。您应该将URL的内容提取到临时文件,或者使用字节在内存中或作为流进行操作。

请注意,myURL.getFile()返回字符串表示形式,而不是实际的File。以类似的方式,这将工作:

File f = new URL("http://www.example.com/docs/resource1.html").getFile(); 
f.exists(); // always false - will not be found in the local filesystem 

一个很好的包装可能是以下几点:

public static File openResourceAsTempFile(ClassLoader loader, String resourceName) 
     throws IOException { 
    Path tmpPath = Files.createTempFile(null, null); 
    try (InputStream is = loader.getResourceAsStream(resourceName)) { 
     Files.copy(is, tmpPath, StandardCopyOption.REPLACE_EXISTING); 
     return tmpPath.toFile(); 
    } catch (Exception e) { 
     if (Files.exists(tmpPath)) Files.delete(tmpPath); 
     throw new IOException("Could not create temp file '" + tmpPath 
       + "' for resource '" + resourceName + "': " + e, e); 
    } 
} 
+0

URL url = getClass()。getClassLoader()。getResource(“/ test.xsd”);给url null。 – user1766169

+0

嗯,你是对的。在我上一个项目中是必要的,但我无法重现这种行为。我编辑了该部分,并添加了示例代码以将资源复制到临时文件,以解决您的问题。请记住在完成后删除临时文件! – tucuxi