- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是按照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 上运行它时,一切都运行良好。但是一旦我尝试从命令行运行应用程序,就会发生空指针异常..
命令行部署层次如下:
文件夹: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
包中的 Test.properties 文件。
关于java - 通过 getClass().getResource() 加载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14089146/
我是一名优秀的程序员,十分优秀!