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

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文件以及资源文件)...

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

当我在日食上运行时,一切运行正常.但是一旦我尝试从cmd行运行应用程序,就会出现空指针异常.

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

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

层次:

  1. SwingDemo
    • CustomDialog.java
    • Test.properties

首先,我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"编译":

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

当使用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.

  • 这有助于我:"如果你将你的应用程序打包成一个jar文件,或者你通过网络加载这些类,它将无法正常工作." - >您需要从文件中获取InputStream. (4认同)

小智 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)