【推荐】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