[英]File loading by getClass().getResource() fails, File() works
[英]File loading by getClass().getResource()
我遵循了使用getClass.getResource(path)
加载资源文件的方式。 代码片段在这里:
String url = "Test.properties";
System.out.println("Before printing paths..");
System.out.println("Path2: "+ getClass().getResource(url).getPath());
FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
i_propConfig.load(inputStream);
inputStream.close();
我已经在 eclipse 中配置了它的层次结构(在源代码下有一个名为 SwingDemo 的文件夹。在 SwingDemo 中有我的 java 文件以及资源文件)...
当我在 eclipse 上运行它时,一切都运行良好。 但是一旦我尝试从 cmd 行运行应用程序,就会发生空指针异常..
命令行部署层次结构如下:
文件夹: D:\\Work\\Java Progrms\\SwingDemo
等级制度:
首先,我从命令行 (javac CustomDialog.java
) 在SwingDemo
文件夹中编译了这个文件。 然后我移一步回到 Java Programs 文件夹(正如我提到的 .java 类中的包)并使用著名的
java SwingDemo.CustomDialog
以前使用 new FileInputStream("path") 时,我曾经遵循类似的步骤。 这样做之后,我得到了空指针异常..
我认为getClass().getResource(url)
无法从特定目录加载文件。 这就是为什么我将资源放在与我的 java 文件相同的目录中。 它在 Eclipse 中运行良好。 但是为什么当我从命令行运行时会出错。
getClass().getResource()
使用类加载器来加载资源。 这意味着资源必须在要加载的类路径中。
使用 Eclipse 执行此操作时,您放在源文件夹中的所有内容都由 Eclipse“编译”:
使用 Eclipse 启动程序时,bin 目录因此位于类路径中,并且由于它包含 Test.properties 文件,因此类加载器可以使用getResource()
或getResourceAsStream()
加载该文件。
如果它在命令行中不起作用,则是因为该文件不在类路径中。
请注意,您不应该这样做
FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
加载资源。 因为只有从文件系统加载文件时才能工作。 如果您将您的应用程序打包成一个 jar 文件,或者您通过网络加载类,它将无法工作。 要获得 InputStream,只需使用
getClass().getResourceAsStream("Test.properties")
最后,正如文档所示,
Foo.class.getResourceAsStream("Test.properties")
将加载与 Foo 类位于同一包中的 Test.properties 文件。
Foo.class.getResourceAsStream("/com/foo/bar/Test.properties")
将加载位于包com.foo.bar
中的com.foo.bar
文件。
从 jar 中的资源文件夹访问文件的最佳方法是通过getResourceAsStream
使用 InputStream 。 如果您仍然需要将资源作为文件实例,您可以将资源作为流复制到临时文件中(JVM 退出时临时文件将被删除):
public static File getResourceAsFile(String resourcePath) {
try {
InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
if (in == null) {
return null;
}
File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
tempFile.deleteOnExit();
try (FileOutputStream out = new FileOutputStream(tempFile)) {
//copy stream
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
}
return tempFile;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.