使用 (getClass().getResourceAsStream("Path/to/pic")) 与 ("Path/to/pic") 的新 Image 实例

new Image instance using (getClass().getResourceAsStream("Path/to/pic")) vs ("Path/to/pic")

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

而不是:

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

我都试过了,两者都很好用,我想知道这种使用getClass().getResourceAsStream()的滚动是否有任何效果或意义。

是的。这个其实很重要。

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

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

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

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

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

为了能够访问资源,请使用 class 对象和 getResourceAsStream(),如您所见。 "magically" 知道(当 class 加载程序和 class 路径设置正确时)当你 运行 在 IDE 中时,资源存储在文件中在工作区中,当您从 JAR 运行 时,资源存储在 JAR 中。它将从存储它们的位置获取这些字节,您将能够创建图像。