如何在没有ImageIO.read()的情况下将加载的字节转换为图像

时间:2015-02-05 08:42:47

标签: java image http byte

由于我自己的限制,我无法使用ImageIO.read()。我只能在GET请求后加载字节,我需要将这些字节保存为文件作为图像。但在我看来,还有一些额外的数据,浏览器通常会过滤(可能是响应头)。所以我得到了原始字节数组,我甚至无法打开它作为图像。

我应该怎么处理这个字节?

示例:

byte[] buf = ContentLoader.loadBytes(new URL("http://images.visitcanberra.com.au/images/canberra_hero_image.jpg"));
try {
            FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\image.jpg"));
            fileOutputStream.write(buf);
            fileOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

loadBytes()方法:

public static byte[] loadBytes(URL url) {
        ByteArrayOutputStream boutArray = new ByteArrayOutputStream();
        try {
            URLConnection connection = url.openConnection();
            BufferedInputStream bin = new BufferedInputStream(connection.getInputStream());
            byte[] buffer = new byte[1024 * 16];
            while (bin.read(buffer) != -1) {
                boutArray.write(buffer);
                boutArray.flush();
            }
            bin.close();
        } catch (Exception e) {
            return null;
        }
        return boutArray.toByteArray();
    }

2 个答案:

答案 0 :(得分:1)

常见问题。在Java中复制流的标准方法是:

int count;
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
out.close();
in.close();

请注意,您需要将read()返回的结果存储到变量中;你需要在下一个write()电话中使用它;你不应该在循环中flush();并且您需要关闭输入和输出流。

为什么你使用ByteArrayInputStream根本就是个谜。这只是浪费时间和空间。直接从URL输入流中读取,并直接写入FileOutputStream

答案 1 :(得分:0)

以下代码适用于我: -

    URL url = new URL("my url...");
    InputStream is = url.openStream();
    OutputStream os = new FileOutputStream("img.jpg");

    byte[] b = new byte[2048];
    int length;

    while ((length = is.read(b)) != -1) {
        os.write(b, 0, length);
    }

    is.close();
    os.close();