首页 文章

新的图像实例使用(getClass() . getResourceAsStream(“Path / to / pic”))vs(“Path / to / pic”)

提问于
浏览
2

当我按照javafx的教程并尝试为ImageView创建一个新的Image实例,将其用于TreeView时,我注意到用于创建ImageView的导师: new ImageView(new Image(getClass().getResourceAsStream("/Path/to/pic"))

代替:

new ImageView(new Image("/Path/to/pic"))

我试过这两个,它对两者都很好,我想知道如果这个使用 getClass().getResourceAsStream() 有任何影响或意义 .

1 回答

  • 1

    是 . 这实际上非常重要 .

    图像是一种资源 . 资源是程序使用的一些不变的信息,例如图像,声音,默认属性,模板,初始数据等 .

    在使用IDE进行开发时,资源通常作为文件存储在工作区的文件夹中 . 因此,只要您使用IDE而不打包程序,就可以将资源视为文件 .

    但是当你想要部署你的程序(打包并将其安装在其他地方,比如服务器或其他人的计算机)时,它通常被打包成一个或多个JAR文件 . JAR文件包括已编译的类和资源 .

    当它们位于JAR文件中时,资源不再是文件 . 它们只是zip条目(zip条目不是文件 - 它们是zip文件的一部分,可以使用适当的软件访问) .

    如果您使用文件操作来访问资源,则会遇到问题,例如this one . 图像不会显示 - 因为文件不存在 . 资源不是文件,它不作为磁盘上的文件存在 . 它只是JAR文件中的一组字节 .

    为了能够访问资源,您可以使用类对象和 getResourceAsStream() . 这个"magically"知道(当正确设置类加载器和类路径时),当您在IDE内部运行时,资源存储在工作空间的文件中,当您从JAR运行时,资源存储在JAR中 . 它将从存储位置获取这些字节,您将能够创建图像 .

相关问题