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

时间:2018-12-09 17:10:31

标签: java imageview treeview javafx-8

当我遵循javafx教程并尝试为ImageView创建新的Image实例,以将其用于TreeView时,我注意到该辅导老师曾经创建过ImageView: extension UIImage { func toCIImage()->CIImage? { if let ciImage = CIImage(image: self) { return ciImage } else { guard let cgImg = self.cgImage else { return nil } return CIImage(cgImage: cgImg) } }

代替:

new ImageView(new Image(getClass().getResourceAsStream("/Path/to/pic"))

我尝试了两种方法,并且都适用。我想知道使用new ImageView(new Image("/Path/to/pic"))进行的这种滚动是否有任何效果或意义。

1 个答案:

答案 0 :(得分:1)

是的。这实际上非常重要。

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

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

但是,当您要部署程序(将其打包并安装到其他位置,例如服务器或其他人的计算机)时,通常会将其打包到一个或多个JAR文件中。 JAR文件包括已编译的类和资源。

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

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

要访问资源,请使用类对象和显示的getResourceAsStream()。当您在IDE中运行时,这“神奇地”知道(当正确设置了类加载器和类路径时),资源存储在工作区中的文件中,而当您从JAR运行时,资源存储在内部。罐。它将从存储它们的字节中获取这些字节,然后您就可以创建图像。