代码之家  ›  专栏  ›  技术社区  ›  walnutmon

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

  •  0
  • walnutmon  · 技术社区  · 14 年前

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

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

    我的问题是为什么?为什么文件的大小没有翻倍?为什么我不先删除它?为什么我可以将一个文件对象带到一个现有的文件中,然后将其视为一个全新的文件?看来,我认为是一个“文件”不是什么文件对象在Java实际上是,否则,这将根本不起作用。

    我的代码做了我想做的事情,但我不相信它总是…似乎太容易了

    2 回复  |  直到 8 年前
        1
  •  3
  •   Powerlord    14 年前

    的javadoc ImageIO.write 包括以下短语:

    使用任意 支持给定 格式转换为 File . 如果已经有了 一 文件 现在,它的内容是 丢弃的。

    这是假设 it 是一个 文件 ,因为您在读写操作中都使用了它。

        2
  •  0
  •   Corrodias    8 年前

    你是对的:Java中的一个文件对象并不是指你听到“文件”这个词时所想到的东西,就像你的文件系统中有一定大小和内容的文档一样。它更像一个路径,事实上,文件实例和最近路径类的实例可以自由地相互转换。

    Java文件实例可能被认为是指向文件的指针。它指向的假设文件可能存在,也可能不存在。如果它存在,它可能是一个目录。在调用在打开它所引用的文件的文件实例上操作的函数(例如 new FileInputStream(file) ,即使这样,文件实例也不知道关于打开的文件句柄的任何信息;只有fileinputstream的新实例知道。

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