【推荐】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.ImageIO
, java.awt.image.BufferedImage
, java.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();
}
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3144582