我按照使用加载资源文件的方式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文件以及资源文件)...
- SRC
- SwingDemo
- CustomDialog.java
- Test.properties
当我在Eclipse上运行的一切,这是运行良好。 但只要我尝试从CMD行空指针异常运行的应用程序是发生..
命令行部署层次结构如下所示:
文件夹: D:\Work\Java Progrms\SwingDemo
层次:
- SwingDemo
- CustomDialog.java
- Test.properties
首先我编这里面的文件SwingDemo
文件夹命令行(javac的CustomDialog.java
)。 然后,我移动一步回Java程序文件夹中(正如我前面提到的.java类里面的包),并通过著名运行的应用程序
java SwingDemo.CustomDialog
我一惯遵循类似步骤,当我用新的FileInputStream(“路径”)以前。 这样做时装后我得到空指针异常..
我认为getClass().getResource(url)
无法从一个特定的目录中加载文件。 这就是为什么我把在同一目录下的资源为我的Java文件。 它在Eclipse中运行良好。 但是,为什么当我从命令行中运行,这是给错误。
getClass().getResource()
使用的类加载器加载资源。 这意味着资源必须在类路径中加载。
当与Eclipse这样做,你把源文件夹中一切“编译”的月蚀:
- .java文件被编译成走的bin目录(默认).class文件
- 其他文件被复制到bin目录(尊重包/文件夹hirearchy)
当启动与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")
将加载位于封装一个Test.properties文件com.foo.bar
。
从资源文件夹访问罐内文件的最好方法是通过使用InputStream中getResourceAsStream
。 如果您还需要将资源作为一个文件例如,您可以复制资源作为流到一个临时文件(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;
}
}