当我在学习 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 文件包括已编译的类和资源。
当它们在 JAR 文件中时,资源不再是文件。它们只是 zip 条目(zip 条目不是文件 - 它们是 zip 文件的一部分,可以使用适当的软件访问)。
如果您使用文件操作来访问资源,您会遇到问题,例如 this one .图像不会显示 - 因为文件不存在。资源不是文件,它不作为文件存在于磁盘上。它只是 JAR 文件中的一组字节。
为了能够访问资源,您可以使用类对象和 getResourceAsStream()
,如您所见。这“神奇地”知道(当类加载器和类路径设置正确时)当您在 IDE 中运行时,资源存储在工作区的文件中,而当您从 JAR 运行时,资源存储在 jar 。它将从存储它们的位置获取这些字节,您将能够创建您的图像。
关于java - 使用 (getClass().getResourceAsStream ("Path/to/pic")) 与 ("Path/to/pic") 的新图像实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53694687/