java.net.URL 读取流到字节[]

2022-08-31 22:16:02

我正在尝试将图像从URL(使用Java包java.net.URL)读取到字节[]。“一切”工作正常,除了内容没有完全从流中读取(图像已损坏,它不包含所有图像数据)...字节数组正保留在数据库 (BLOB) 中。我真的不知道正确的方法是什么,也许你可以给我一个提示。:)

这是我的第一种方法(代码格式化,删除了不必要的信息...):

URL u = new URL("http://localhost:8080/images/anImage.jpg");
int contentLength = u.openConnection().getContentLength();
Inputstream openStream = u.openStream();
byte[] binaryData = new byte[contentLength];
openStream.read(binaryData);
openStream.close();

我的第二种方法是这个(正如你所看到的,它正在以另一种方式获取):contentlength

URL u = new URL(content);
openStream = u.openStream();
int contentLength = openStream.available();
byte[] binaryData = new byte[contentLength];
openStream.read(binaryData);
openStream.close();

这两个代码都会导致图像损坏...我已经从Stack Overflow中阅读了这篇文章。


答案 1

无法保证您提供的内容长度实际上是正确的。尝试类似于以下内容的方法:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = null;
try {
  is = url.openStream ();
  byte[] byteChunk = new byte[4096]; // Or whatever size you want to read in at a time.
  int n;

  while ( (n = is.read(byteChunk)) > 0 ) {
    baos.write(byteChunk, 0, n);
  }
}
catch (IOException e) {
  System.err.printf ("Failed while reading bytes from %s: %s", url.toExternalForm(), e.getMessage());
  e.printStackTrace ();
  // Perform any other exception handling that's appropriate.
}
finally {
  if (is != null) { is.close(); }
}

然后,您将在 中输入图像数据,您可以通过调用 从中获取字节数组。baosbaos.toByteArray()

这段代码未经测试(我只是在答案框中写了它),但它与我认为你所追求的相当接近。


答案 2

只是用commons-io扩展了Barnards的答案。单独的答案,因为我无法在注释中格式化代码。

InputStream is = null;
try {
  is = url.openStream ();
  byte[] imageBytes = IOUtils.toByteArray(is);
}
catch (IOException e) {
  System.err.printf ("Failed while reading bytes from %s: %s", url.toExternalForm(), e.getMessage());
  e.printStackTrace ();
  // Perform any other exception handling that's appropriate.
}
finally {
  if (is != null) { is.close(); }
}

http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#toByteArray(java.io.InputStream)