如何將整個InputStream
讀入字節數組? java
您須要從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();
您可使用Apache Commons IO處理此任務和相似任務。 this
IOUtils
類型具備靜態方法來讀取InputStream
並返回byte[]
。 編碼
InputStream is; byte[] bytes = IOUtils.toByteArray(is);
在內部,這將建立一個ByteArrayOutputStream
並將字節複製到輸出,而後調用toByteArray()
。 它經過複製4KiB塊中的字節來處理大型文件。 spa
您是否真的須要將圖像做爲byte[]
? 您對byte[]
指望是什麼-圖像文件的完整內容,以圖像文件所使用的任何格式或RGB像素值進行編碼? 插件
這裏的其餘答案顯示瞭如何將文件讀取爲byte[]
。 您的byte[]
將包含文件的確切內容,而且您須要對其進行解碼以對圖像數據進行任何處理。 code
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服務提供商接口的插件)。
另請參見如下教程: 使用圖像
我試圖用修復垃圾數據的方法來編輯@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不須要關閉。 嘗試/最終構造被省略以提升可讀性
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(); }