Anj*_*anN 42 java load file embedded-resource
我已经按照加载资源文件的方式使用了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();
Run Code Online (Sandbox Code Playgroud)
我已经在eclipse中使用层次结构配置它(在源代码下有一个名为SwingDemo的文件夹.在SwingDemo中有我的java文件以及资源文件)...
当我在日食上运行时,一切运行正常.但是一旦我尝试从cmd行运行应用程序,就会出现空指针异常.
命令行部署层次结构如下:
文件夹: D:\Work\Java Progrms\SwingDemo
层次:
首先,我SwingDemo从命令行(javac CustomDialog.java)在文件夹中编译了这个文件.然后我将一步回到Java Programs文件夹(正如我在.java类中提到的那样)并使用着名的程序运行应用程序
java SwingDemo.CustomDialog
Run Code Online (Sandbox Code Playgroud)
我之前使用新的FileInputStream("path")时,我曾经遵循类似的步骤.做这种方式后我得到空指针异常..
我认为getClass().getResource(url)无法从特定目录加载文件.这就是我将资源放在与我的java文件相同的目录中的原因.它在Eclipse中运行良好.但是当我从命令行运行时,为什么这会出错.
JB *_*zet 74
getClass().getResource()使用类加载器加载资源.这意味着资源必须位于要加载的类路径中.
使用Eclipse时,您在源文件夹中放置的所有内容都由Eclipse"编译":
当使用Eclipse启动程序时,bin目录因此位于类路径中,并且由于它包含Test.properties文件,因此可以使用getResource()或使用类加载器加载此文件getResourceAsStream().
如果它在命令行中不起作用,那么因为该文件不在类路径中.
请注意,你不应该这样做
FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
Run Code Online (Sandbox Code Playgroud)
加载资源.因为只有从文件系统加载文件时才能使用它.如果将应用程序打包到jar文件中,或者通过网络加载类,则无法使用.要获得InputStream,只需使用
getClass().getResourceAsStream("Test.properties")
Run Code Online (Sandbox Code Playgroud)
最后,正如文件所示,
Foo.class.getResourceAsStream("Test.properties")
Run Code Online (Sandbox Code Playgroud)
将加载与类Foo位于同一包中的Test.properties文件.
Foo.class.getResourceAsStream("/com/foo/bar/Test.properties")
Run Code Online (Sandbox Code Playgroud)
将加载位于包中的Test.properties文件com.foo.bar.
小智 16
从jar中的资源文件夹访问文件的最佳方法是使用InputStream via 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;
}
}
Run Code Online (Sandbox Code Playgroud)