当前位置: 首页 > 知识库问答 >
问题:

文件由getClass()加载。getResource()

陆琦
2023-03-14

我遵循了使用getClass.get资源(路径)加载资源文件的方式。代码片段在这里:

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中用层次结构对其进行了配置(在source下有一个名为SwingDemo的文件夹。在SwingDemo中有我的java文件和资源文件)。。。

  • src公司

当我在eclipse上运行它时,一切都运行正常。但是一旦我尝试从cmd行运行应用程序,就会发生空指针异常。

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

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

等级制度:

  • SwingDemo
    • 自定义对话框。爪哇语
    • 测试。属性

    首先,我从命令行(javacCustomDialog.java)在SwingDemo文件夹中编译了这个文件。然后我返回到Java程序文件夹(正如我在.Java类中提到的包),并使用著名的

    java SwingDemo.CustomDialog
    

    我以前使用新的FileInputStream(“path”)时也遵循类似的步骤。这样做之后,我得到了空指针异常。。

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


共有2个答案

贾沛
2023-03-14

从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;
    }
}
夹谷浩宕
2023-03-14

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

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

  • 。java文件编译成。进入bin目录的类文件(默认情况下)

当使用Eclipse启动程序时,bin目录因此位于类路径中,因为它包含测试。属性文件,该文件可以由类加载器使用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文件。

 类似资料:
  • 我正在尝试将我的angular2应用程序从已弃用的路由器切换到推荐的路由器[https://angular.io/docs/ts/latest/guide/router.html][1]。我正在使用angular2 cli帮助构建我的项目。我已经在没有cli的种子项目中成功地完成了这一点,但是在使用cli执行此操作时,我一直收到此错误: 加载错误http://localhost:4200/app.

  • 我有AngularJs ui路由器在我的应用程序。我需要加载js文件基于我的状态。 当主控状态加载时,headerController、homeController和footerController具有不同的js文件。我们需要加载控制器js文件。是否可以通过UI路由器?

  • 背景:我正在写一个游戏(作为一个可执行的罐子),我的游戏的一部分是一个偏好对话框,你可以在其中设置对手的名字和影响游戏进展的不同变量。我决定这将是很好的,如果这些被保存在退出,所以下一次你加载的应用程序,它会记得你之前设置了什么。 为此,我将变量写入jar中的一个txt文件,然后在启动新游戏时读取该文件。通过eclipse,这一切都可以正常工作,但当我导出到jar时,它根本不起作用。这是我用来读取

  • 我正在尝试加载我的 *.fxml 文件,这些文件位于不同的包中,打包在 JAR 中。 我的文件夹结构:(所有文件夹都在类路径中) 正如这里提到的,我使用以下语句来加载FXML文件。(没有前导斜杠“/”)该方法在文件中调用。 如果我在eclipse中运行这个项目,这工作得很好,但是如果我执行JAR(它是用Gradle创建的),就会出现< code > Java . lang . illegalsta

  • 主要内容:加载现有的PDF文档,第1步:加载现有的PDF文档,示例在前面的例子中,已经学习了如何创建一个新文档并向其中添加页面。 本章将教您如何加载系统中已经存在的PDF文档,并对其进行一些操作。 加载现有的PDF文档 类的方法用于加载现有的PDF文档。 按照以下步骤加载现有的PDF文档。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态方法,可以直接使用类名称调用它,如下所示。 第2步:执行

  • 当打包构建应用时,Javascript 包会变得非常大,影响页面加载速度。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。 结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。如: const Foo = () => import('./Foo.vue') 当你觉得你的页面热更新速度慢的时候,才需要往下看