通过getClass()加载文件.getResource()

时间:2012-12-30 07:49:12

标签: java file load 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();

我已经在eclipse中使用层次结构配置它(在源代码下有一个名为SwingDemo的文件夹。在SwingDemo中有我的java文件以及资源文件)...

  1. SRC
    • SwingDemo
      1. CustomDialog.java
      2. Test.properties
  2. 当我在eclipse上运行时,一切运行正常。但是一旦我尝试从cmd行运行应用程序,就会出现空指针异常..

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

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

    层次结构:

    1. SwingDemo
      • CustomDialog.java
      • Test.properties
    2. 首先,我从命令行(javac SwingDemo)在CustomDialog.java文件夹中编译了这个文件。然后我将一步回到Java Programs文件夹(正如我在.java类中提到的那样)并使用着名的

      运行应用程序
      java SwingDemo.CustomDialog
      

      我之前使用新的FileInputStream(“path”)时,我常常遵循类似的步骤。 在做这种方式之后我得到空指针异常..

      我认为getClass().getResource(url)无法从特定目录加载文件。这就是我将资源放在与我的java文件相同的目录中的原因。它在Eclipse中运行良好。但是当我从命令行运行时,为什么这会出错。

2 个答案:

答案 0 :(得分:70)

getClass().getResource()使用类加载器加载资源。这意味着资源必须位于要加载的类路径中。

在使用Eclipse时,您在源文件夹中放置的所有内容都由Eclipse“编译”:

  • .java文件被编译为.class文件,这些文件位于bin目录(默认情况下)
  • 将其他文件复制到bin目录(尊重包/文件夹雇员)

当使用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;
    }
}