java.net.URL read stream to byte[]
There's no guarantee that the content length you're provided is actually correct. Try something akin to the following:
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(); }}
You'll then have the image data in baos
, from which you can get a byte array by calling baos.toByteArray()
.
This code is untested (I just wrote it in the answer box), but it's a reasonably close approximation to what I think you're after.
Just extending Barnards's answer with commons-io. Separate answer because I can not format code in comments.
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(); }}
Here's a clean solution:
private byte[] downloadUrl(URL toDownload) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { byte[] chunk = new byte[4096]; int bytesRead; InputStream stream = toDownload.openStream(); while ((bytesRead = stream.read(chunk)) > 0) { outputStream.write(chunk, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); return null; } return outputStream.toByteArray();}