Java获取资源不起作用

时间:2017-06-05 08:23:25

标签: java

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

代码:

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

执行jar文件时的输出:

  

文件:/ C:!/Users/username/Repo/run/Application.jar /test.xsd
  假

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

1 个答案:

答案 0 :(得分:1)

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

请注意myURL.getFile()返回String表示形式,而不是实际的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);
    }
}