Java在线程中保存大图像 - IP相机损坏的图像

时间:2014-08-29 12:40:51

标签: java multithreading image overwrite

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

我不知道如何调试它。

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 busy”。当我尝试ff和chrome时,我得到了破碎的图像。所以我必须做像排队或禁用按钮......

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

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

One from saved Images

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这个答案是猜测,因为你没有给出完整的代码,问题可能是变量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(String prefix,                   字符串后缀,                   文件目录)

//你可以传递extn作为jpg

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