繁体   English   中英

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

[英]Java/Groovy File IO Replacing an Image File with it's own Contents - Why Does This Work?

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

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

我的问题是为什么? 为什么文件最终大小不加倍? 为什么我不必先删除它? 为什么能将文件对象带到现有文件中,然后将其视为全新文件对象? 看来我认为是“文件”的东西实际上并不是java中的File对象,否则这根本就不起作用。

我的代码完全按照我想要的去做,但是我不相信它总是会做的……似乎太简单了

用于ImageIO.write的JavaDoc包括以下短语:

使用支持给定格式的任意ImageWriter将图像写入File 如果已经存在File ,则将其内容丢弃。

假设itFile ,就像您在读取和写入操作中都使用它一样。

您是正确的:Java中的File对象所引用的内容与您听到“ file”一词时可能会想到的东西不同,就像文件系统上具有一定大小和内容的文档中那样。 它更像是一条路径,实际上File实例和最新Path类的实例可以自由地相互转换。

可以将Java File实例视为指向文件的指针。 它指向的假设文件可能存在也可能不存在。 如果存在,则可能是目录。 在调用调用打开该文件所引用文件的File实例上运行的函数new FileInputStream(file)例如new FileInputStream(file) ,它不是“打开”的,以供读取或写入,即使这样,File实例也不知道有关该打开文件的任何信息处理; 只有FileInputStream的新实例可以。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM