【问题标题】:Does `javax.imageio.ImageIO` require file locking?`javax.imageio.ImageIO` 是否需要文件锁定?
【发布时间】:2015-04-25 21:27:33
【问题描述】:

我的应用程序正在将图像保存到文件夹中。同时另一个软件会监视这个文件夹并打印粘贴的图像。

我遇到的问题是打印应用程序可以在打印机上发送半渲染图像,或者根本不对保存的图像做出反应。

我正在使用javax.imageio.ImageIO.write(RenderedImage im, String formatName, File output)BufferedImage 保存为png 格式。

如果需要锁定,请提供带有显式锁定的代码示例。如果不解释原因。

我已经在WindowsJRE 1.8 上测试过

【问题讨论】:

  • 写入后是否尝试过同步文件? docs.oracle.com/javase/8/docs/api/java/io/…
  • 如果我正确理解 javadoc sync 会阻塞当前线程,直到缓冲区被刷新。所以应该在读取文件之前调用它,因此在打印应用程序中。无法编辑。
  • 主要目的是强制(或至少要求)操作系统确保所有数据(包括元数据)都已保存到磁盘。我在过去看到过 Windows 的问题,其中 1 个进程写入文件,另一个进程几乎立即读取文件,而第二个进程看到的大小错误。
  • @BrettOkken 我如何证明这会有所帮助?
  • 问题不在于它需要锁定。问题是它需要完整的文件,而您目前的技术无法确保这一点。

标签: java image io locking file-locking


【解决方案1】:

基本上,您应该将图像写入临时文件,然后将其重命名为最终文件名。这样,文件在其他应用程序意识到之前就已完全写入。

【讨论】:

  • 我使用FIles#moveATOMIC_MOVE 复制选项。
【解决方案2】:

您可能希望实现某种锁定机制,即文件仅在完全写入时才被读取,或者根本不读取。

【讨论】:

  • 锁定不是只适用于nio吗?
  • 这与 Java 完全无关。如果愿意,可以编写一个 Java 程序,每 1 秒向文件追加一行。和'cat'(或任何你的操作系统)不时在另一个shell中写入文件。你会看到你的其他进程看到了什么。
猜你喜欢
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2015-10-31
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多