我有一些JPG文件需要在运行时用自己的JFIF标准化版本替换(我们使用的供应商为我们提供了没有正确标题的JPG,因此它们在某些应用程序中不起作用)。 。我能够从现有图像创建一个新文件,然后从该文件中获取一个缓冲图像,并将内容直接写回文件,而不必删除它,并且它可以工作......
imageSrcFolder.eachFileMatch ( ~/.*\.jpg/, {
BufferedImage bi = ImageIO.read( it )
ImageIO.write( bi, "jpg", it )
});
我的问题是为什么?为什么文件的大小不会翻倍?我为什么不先删除它?为什么我能够将文件对象带到现有文件,然后将其视为一个全新的文件?似乎我认为是“文件”不是java中的File对象实际上是什么,否则这根本不起作用。
我的代码完全符合我的要求,但我不相信它总是会...它似乎太容易了
答案 0 :(得分:3)
ImageIO.write
的JavaDoc包含以下短语:
使用任意方式写入图像 ImageWriter支持给定的 格式为
File
。如果已经存在了 一个File
在场,其内容是 丢弃。
这假设it
是File
,正如您在读取和写入操作中使用它一样。
答案 1 :(得分:0)
你是对的:Java中的File对象并不是指您听到单词" file"时所想的相同内容,就像文件系统中具有一定大小的文档一样和内容。它更像是一个路径,实际上File的实例和更新的Path类的实例可以自由地相互转换。
Java File实例可能被认为是指向文件的指针。它指向的假设文件可能存在也可能不存在。如果存在,则可能是目录。它不是"开放"用于读取或写入,直到您调用在打开其引用的文件的File实例上运行的函数,例如new FileInputStream(file)
,即使这样,File实例也不知道有关该打开文件句柄的任何信息;只有FileInputStream的新实例才有。
因此,ImageIO.read(...)
正在打开文件,读取其内容,最后关闭它。 ImageIO.write(...)
要么在打开文件后删除文件,要么删除文件内容,然后写入文件,最后关闭文件。它们都在同一个File实例上运行,并且它继续指向相同的文件路径,但之后该路径上的文件可能完全不同。