【问题标题】:ImageIO.read() stalls program when running without EclipseImageIO.read() 在没有 Eclipse 的情况下运行时停止程序
【发布时间】:2014-08-05 05:01:34
【问题描述】:

此代码在 BufferedImage 对象中加载图像。 ImageIO.read() 可以将 InputStream 作为参数。

我首先尝试从套接字获取 InputStream 并加载。然后我尝试将图像加载到一个字节数组中并将这个数组作为参数(我认为问题出在连接上)。

当我通过 Eclipse 运行我的程序时,这两种方法都可以正常工作,而当我将项目保存为可运行的 jar 文件时,这两种方法都不起作用。代码卡在最后一行。

byte[] buffer = new byte[imageBufferSize];
int count = 0;
while ((count = in.read(buffer)) != -1) {
    //nothing here. Just reading in buffer in while cycle.
}
String bytesStr = new String(buffer);
int skipPos = bytesStr.indexOf("‰PNG");
byte[] newBytes = Arrays.copyOfRange(buffer, skipPos, buffer.length);
bufImg = ImageIO.read(new ByteArrayInputStream(newBytes));

【问题讨论】:

  • 您是否尝试过将其放在 try catch 子句中 - 如果是,有什么例外?
  • 另外,你是如何创建 jar 文件的
  • 我试过了。没有发现任何异常。但它并没有像我之前所说的那样卡住。它进入try-catch的finally块。关于创建 - 我只是将它导出为 Eclipse 中的 Runnable jar 文件,它总是可以正常构建。我还检查了 .jar 文件。我使用的所有库都在那里。
  • finally 子句中的 bufImg 是否为空?
  • 您的缓冲区读取 while 循环是假的。如果您碰巧一口气读取了imageBufferSize 字节,它只会(偶然)起作用。使用read(byte[], int, int)方法,设置起始偏移为0,为while循环的每次迭代加上count。

标签: java eclipse blocking javax.imageio


【解决方案1】:

正如我在评论中提到的,问题很可能是您的 while-loop 没有达到您的预期(问题是对于每次迭代,它都会从一开始就覆盖 buffer em>,在buffer 中产生乱码数据。要将所有输入流正确读入buffer,请使用以下代码:

byte[] buffer = new byte[imageBufferSize];
int count = 0;
int offset = 0;

while ((count = in.read(buffer, offset, imageBufferSize - offset)) != -1) {
    offset += count;
}

bufImg 之所以是null,可能只是因为ImageIO.read(..) 为它不理解的数据返回null

【讨论】:

  • 我按照你说的编辑了我的代码,但是还是不行。我第一次使用 java.net.URLConnection.getInputStream() 为我的图像创建输入流。但它给出了相同的结果。所以不幸的是,这段代码中没有错误。
  • 我无法理解的主要问题是所有这些代码在 Eclipse 中运行时都可以正常工作。
  • 尝试将buffernewBytes 转储到磁盘,并在十六进制编辑器中查看它们。无论有没有 Eclipse。你能看看网络流量吗?也许 Eclipse 在HttpURLConnection 中添加了一些“神奇”的标题?我见过更奇怪的事情...您是否尝试过使用带有已知良好文件的FileInputStream,只是为了去掉一些变量?
  • 我以前也这样做过。没关系。图像是正确的。可能有用的一件事是我的程序可以使用代理直接下载图片。而且只有直接下载是行不通的。当我通过代理创建相同的套接字并获取它的流(或通过代理创建 java.net.URLConnection)时,它可以在没有 Eclipse 的情况下正常工作。
  • 一些更新。我曾经在我的 try-catch 子句中捕获异常。现在我试图捕捉并打印 Throwable。正如我所料 - 它是错误:java.lang.NoClassDefFoundError:无法初始化类 javax.imageio.ImageIO。所以在 Eclipse 中它会正常初始化,没有 Eclipse 它会崩溃。有任何想法吗? :)
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2011-06-25
  • 2018-04-01
  • 2014-05-31
  • 2016-08-22
  • 2012-04-29
相关资源
最近更新 更多