0

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

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

我的问题是为什么?为什么文件最终没有翻倍?为什么我不必先删除它?为什么我能够将文件对象放入现有文件,然后将其视为全新文件?似乎我认为是“文件”的东西并不是 java 中的 File 对象实际上是什么,否则这根本行不通。

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

4

2 回答 2

3

JavaDoc forImageIO.write包括这个短语:

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

这是假设它it是 a File,因为您在读取和写入操作中都使用了它。

于 2010-03-18T19:07:26.007 回答
0

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

Java File 实例可能被认为是指向文件的指针。它指向的假设文件可能存在也可能不存在。如果它存在,它可能是一个目录。在您调用在 File 实例上操作的函数打开它所引用的文件之前,它不会“打开”读取或写入,例如new FileInputStream(file),即使这样 File 实例也不知道该打开文件句柄的任何信息;只有 FileInputStream 的新实例可以。

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

于 2016-09-17T12:50:43.057 回答