Java / Groovy文件IO用它自己的内容替换图像文件 - 为什么这样做?

时间:2010-03-18 19:00:18

标签: java file groovy replace javax.imageio

我有一些JPG文件需要在运行时用自己的JFIF标准化版本替换(我们使用的供应商为我们提供了没有正确标题的JPG,因此它们在某些应用程序中不起作用)。 。我能够从现有图像创建一个新文件,然后从该文件中获取一个缓冲图像,并将内容直接写回文件,而不必删除它,并且它可以工作......

imageSrcFolder.eachFileMatch ( ~/.*\.jpg/, {
    BufferedImage bi = ImageIO.read( it )
    ImageIO.write( bi, "jpg", it )
});

我的问题是为什么?为什么文件的大小不会翻倍?我为什么不先删除它?为什么我能够将文件对象带到现有文件,然后将其视为一个全新的文件?似乎我认为是“文件”不是java中的File对象实际上是什么,否则这根本不起作用。

我的代码完全符合我的要求,但我不相信它总是会...它似乎太容易了

2 个答案:

答案 0 :(得分:3)

ImageIO.write的JavaDoc包含以下短语:

  

使用任意方式写入图像   ImageWriter支持给定的   格式为File。如果已经存在了   一个File在场,其内容是   丢弃。

这假设itFile,正如您在读取和写入操作中使用它一样。

答案 1 :(得分:0)

你是对的:Java中的File对象并不是指您听到单词" file"时所想的相同内容,就像文件系统中具有一定大小的文档一样和内容。它更像是一个路径,实际上File的实例和更新的Path类的实例可以自由地相互转换。

Java File实例可能被认为是指向文件的指针。它指向的假设文件可能存在也可能不存在。如果存在,则可能是目录。它不是"开放"用于读取或写入,直到您调用在打开其引用的文件的File实例上运行的函数,例如new FileInputStream(file),即使这样,File实例也不知道有关该打开文件句柄的任何信息;只有FileInputStream的新实例才有。

因此,ImageIO.read(...)正在打开文件,读取其内容,最后关闭它。 ImageIO.write(...)要么在打开文件后删除文件,要么删除文件内容,然后写入文件,最后关闭文件。它们都在同一个File实例上运行,并且它继续指向相同的文件路径,但之后该路径上的文件可能完全不同。