在Java中將InputStream轉換爲字節數組

如何將整個InputStream讀入字節數組? java


#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處理此任務和相似任務。 this

IOUtils類型具備靜態方法來讀取InputStream並返回byte[]編碼

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

在內部,這將建立一個ByteArrayOutputStream並將字節複製到輸出,而後調用toByteArray() 。 它經過複製4KiB塊中的字節來處理大型文件。 spa


#3樓

您是否真的須要將圖像做爲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.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();
}
相關文章
相關標籤/搜索