我尝试从我的应用程序中读取资源文件,但它不起作用。
代码:
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文件时代码不起作用?
答案 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);
}
}