通过的getClass()文件加载。getResource()方法(File loading by

2019-07-17 16:44发布

我按照使用加载资源文件的方式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文件以及资源文件)...

  1. SRC
    • SwingDemo
      1. CustomDialog.java
      2. Test.properties

当我在Eclipse上运行的一切,这是运行良好。 但只要我尝试从CMD行空指针异常运行的应用程序是发生..

命令行部署层次结构如下所示:

文件夹: D:\Work\Java Progrms\SwingDemo

层次:

  1. SwingDemo
    • CustomDialog.java
    • Test.properties

首先我编这里面的文件SwingDemo文件夹命令行(javac的CustomDialog.java )。 然后,我移动一步回Java程序文件夹中(正如我前面提到的.java类里面的包),并通过著名运行的应用程序

java SwingDemo.CustomDialog

我一惯遵循类似步骤,当我用新的FileInputStream(“路径”)以前。 这样做时装后我得到空指针异常..

我认为getClass().getResource(url)无法从一个特定的目录中加载文件。 这就是为什么我把在同一目录下的资源为我的Java文件。 它在Eclipse中运行良好。 但是,为什么当我从命令行中运行,这是给错误。

Answer 1:

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



Answer 2:

从资源文件夹访问罐内文件的最好方法是通过使用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;
    }
}


文章来源: File loading by getClass().getResource()