我已经按照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 SwingDemo
)在CustomDialog.java
文件夹中编译了这个文件。然后我将一步回到Java Programs文件夹(正如我在.java类中提到的那样)并使用着名的
java SwingDemo.CustomDialog
我之前使用新的FileInputStream(“path”)时,我常常遵循类似的步骤。 在做这种方式之后我得到空指针异常..
我认为getClass().getResource(url)
无法从特定目录加载文件。这就是我将资源放在与我的java文件相同的目录中的原因。它在Eclipse中运行良好。但是当我从命令行运行时,为什么这会出错。
答案 0 :(得分:70)
getClass().getResource()
使用类加载器加载资源。这意味着资源必须位于要加载的类路径中。
在使用Eclipse时,您在源文件夹中放置的所有内容都由Eclipse“编译”:
当使用Eclipse启动程序时,bin目录因此位于类路径中,并且由于它包含Test.properties文件,因此类文件可以使用getResource()
或{{1}加载此文件}。
如果它在命令行中不起作用,那么因为该文件不在类路径中。
请注意,您不应该
getResourceAsStream()
加载资源。因为只有从文件系统加载文件时才能使用它。如果将应用程序打包到jar文件中,或者通过网络加载类,则无法使用。要获得InputStream,只需使用
FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
最后,正如文件所示,
getClass().getResourceAsStream("Test.properties")
将加载与类Foo位于同一包中的Test.properties文件。
Foo.class.getResourceAsStream("Test.properties")
将加载位于包Foo.class.getResourceAsStream("/com/foo/bar/Test.properties")
中的Test.properties文件。
答案 1 :(得分:15)
从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;
}
}