【问题标题】:Java saving large images in threads - IP camera broken imagesJava在线程中保存大图像-IP摄像头损坏的图像
【发布时间】:2014-10-23 11:30:04
【问题描述】:

在我的应用程序中单击一个按钮后,它会创建新的普通线程并开始下载大图像并将其保存到文件中。一切都很顺利,但是当我多次单击按钮时,它没有错误,当我尝试查看这些图像时,它们被窃听,就像它们重新覆盖自己一样。

我不知道如何调试它。

localPath = today + "/" + productCode + "/" + this.placeId; //Unique

/* ... */

private void productSave(String productCode, int whichCamera, boolean isError) {
  for (int i = position; i < lastCamera; i++) {
    Date dateSave = new Date();
    path = localPath + "/" + dateFormat.format(dateSave) + "_" + (i + 1) + ".jpg";

    try {
      BufferedImage imageOld = ImageIO.read(new URL(this.camerasUrlsToSave[i]));

      ImageIO.write(imageOld, "jpg", new File(rootPath + "/" + path));

      ComDb.getInstance().saveProduct(productCode, this.placeId, path, dateSave);
    } catch (IOException ex) {
      result = false;
    }
  }
}

编辑:路径是 100% 唯一的(带有产品代码的不同文件夹)。而且相机的图像应该没有问题 - 我可以打开 10 张卡片,但看不到图像错误

EDIT2:可以像下载 Img bufor 一样吗?因为所有图像都是从同一个 IP 下载的。或者可能是它与 bufferedimg 内存泄漏有关的问题。想知道如何修复它。

EDIT3:我发现如果我在网络浏览器中使用我的相机地址打开 5 张卡片,例如:blah.blah.some.ip/GetImage.cgi?CH=0 它们会一个接一个地加载,而不是一次全部加载.但是,下载结束时我没有看到错误的图像。

EDIT4:如果我尝试在 ff 和 IE 中打开链接,我试图在网络浏览器中重现此错误。 IE 打印“getImage 忙”。当我尝试 ff 和 chrome 时,我得到了损坏的图像。所以我必须做一些事情,比如排队或禁用按钮......

EDIT5:我的临时解决方案:同步函数 productSave。第二次点击的图像将在几秒钟后保存。

http://oi57.tinypic.com/ofrrn.jpg!

One from saved Images

【问题讨论】:

  • 变量 i 来自哪里?这是完整的代码吗?
  • Threads and file writing的可能重复
  • @BCartolo 每个图像都有自己的文件。
  • @szymon Hab 如果用户多次单击该按钮,则该方法将使用相同的参数多次调用。我对吗?否则会给我们更多的上下文。
  • 额外提示:创建一个新的 3000 x 3000 BufferedImage INT 类型将花费您 36000000 字节(并且需要一些时间来分配那个巨大的数组)。但它不会给你任何东西,因为下一行将覆盖。不过,这不是您的主要问题。

标签: java multithreading image overwrite


【解决方案1】:

按钮点击事件的第一个动作应该是禁用按钮,并可能将文本更改为“处理中”。最后的操作应该是重新启用按钮并恢复文本。

【讨论】:

【解决方案2】:

这个答案是一个猜测,因为你没有给出完整的代码,问题可能是变量 i - 它来自哪里?

或者可能是相同的文件名被重复使用,请确保通过从类似这样的单独函数获取唯一文件名来确保不是这种情况:

如果 dateFormat 只是到分钟或秒,相同的文件名可能用于 2 张图像使用 java.io.File 的这个 API 来获取唯一的名称

http://docs.oracle.com/javase/7/docs/api/java/io/File.html#createTempFile%28java.lang.String,%20java.lang.String,%20java.io.File%29

public static File createTempFile(字符串前缀, 字符串后缀, 文件目录)

//你可以将extn作为jpg传递

public File getFileName(File localPath ,Date dateSave, int i, String extn){
    File fileUniqe = File.createTempFile(dateSave + "_" + (i+1), extn, localPath );
    return fileUniqe,
}

【讨论】:

  • 所以 i 是一个局部变量,仍然使用上面的函数来获取唯一的文件名
  • 更新了我已经在调试的代码,文件名不是问题——它 100% 唯一,因为 localpath 指向当前产品代码
  • 尝试这样做有什么害处?
  • 我像这样将下一个变量添加到我的文件名中,但它没有帮助。我开始考虑 IP 摄像头,因为我在 Java 中没有看到任何类似的问题和解决方案。
猜你喜欢
  • 2014-12-27
  • 2023-03-19
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多