在Java中将InputStream转换为字节数组

﹥>﹥吖頭↗ 提交于 2019-12-18 19:18:44

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

如何将整个InputStream读入字节数组?


#1楼

您需要从InputStream读取每个字节并将其写入ByteArrayOutputStream 。 然后,您可以通过调用toByteArray()来检索基础的字节数组; 例如

InputStream is = ...
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] data = new byte[16384];

while ((nRead = is.read(data, 0, data.length)) != -1) {
  buffer.write(data, 0, nRead);
}

return buffer.toByteArray();

#2楼

您可以使用Apache Commons IO处理此任务和类似任务。

IOUtils类型具有静态方法来读取InputStream并返回byte[]

InputStream is;
byte[] bytes = IOUtils.toByteArray(is);

在内部,这将创建一个ByteArrayOutputStream并将字节复制到输出,然后调用toByteArray() 。 它通过复制4KiB块中的字节来处理大型文件。


#3楼

您是否真的需要将图像作为byte[] ? 您对byte[]期望是什么-图像文件的完整内容,以图像文件所使用的任何格式或RGB像素值进行编码?

这里的其他答案显示了如何将文件读取为byte[] 。 您的byte[]将包含文件的确切内容,并且您需要对其进行解码以对图像数据进行任何处理。

Java的用于读取(和写入)图像的标准API是ImageIO API,您可以在包javax.imageio找到它。 您只需一行代码就可以从文件中读取图像:

BufferedImage image = ImageIO.read(new File("image.jpg"));

这将为您提供BufferedImage ,而不是byte[] 。 要获取图像数据,可以在BufferedImage上调用getRaster() 。 这将为您提供一个Raster对象,该对象具有访问像素数据的方法(它具有几个getPixel() / getPixels()方法)。

查找有关javax.imageio.ImageIOjava.awt.image.BufferedImagejava.awt.image.Raster等的API文档。

ImageIO默认情况下支持多种图像格式:JPEG,PNG,BMP,WBMP和GIF。 可以增加对更多格式的支持(您需要一个实现ImageIO服务提供商接口的插件)。

另请参见以下教程: 使用图像


#4楼

我试图用修复垃圾数据的方法来编辑@numan的答案,但是编辑被拒绝了。 虽然这段简短的代码并不出色,但我看不到其他更好的答案。 这对我来说最有意义:

ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024]; // you can configure the buffer size
int length;

while ((length = in.read(buffer)) != -1) out.write(buffer, 0, length); //copy streams
in.close(); // call this in a finally block

byte[] result = out.toByteArray();

btw ByteArrayOutputStream不需要关闭。 尝试/最终构造被省略以提高可读性


#5楼

public static byte[] getBytesFromInputStream(InputStream is) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[0xFFFF];
    for (int len = is.read(buffer); len != -1; len = is.read(buffer)) { 
        os.write(buffer, 0, len);
    }
    return os.toByteArray();
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!