將InputStream轉換為Byte數組的方法

一、使用ByteArrayOutputStream的方式

在Java語言中,InputStream是讀取數據的基本方式。但是,有時候我們需要將InputStream轉化為Byte數組。而使用ByteArrayOutputStream是最常見的方法之一。下面是代碼示例:

public byte[] readBytesFromInputStream(InputStream input) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    byte[] buffer = new byte[4096];
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
    }
    return output.toByteArray();
}

首先,我們創建了ByteArrayOutputStream對象output,並定義了一個byte類型的buffer數組。接下來,我們使用input.read(buffer)讀取input中的數據到buffer中,並通過output.write(buffer, 0, n)buffer中的數據寫入到output中。最後,調用output.toByteArray()output轉換成byte數組。該方法的缺點是需要在內存中保持所有數據。

二、使用ByteArrayInputStream的方式

除了使用ByteArrayOutputStream實現InputStream轉換成byte數組,還可以使用ByteArrayInputStream。下面是代碼示例:

public byte[] readBytesFromInputStream(InputStream input) {
    try {
        return org.apache.commons.io.IOUtils.toByteArray(input);
    } catch (IOException e) {
         e.printStackTrace();
    }
    return null;
}

在這個方法中,我們使用了Apache Commons IO庫,調用org.apache.commons.io.IOUtilstoByteArray方法將input轉換為byte數組。這種方法不需要擔心內存限制,因為只有需要數據時才會從input對象中讀取。

三、使用BufferedInputStream的方式

Java標準庫中,還提供了BufferedInputStream,可以實現輸入流的緩存。下面是代碼示例:

public byte[] readBytesFromInputStream(InputStream input) {
    try {
        BufferedInputStream bufferedInput = new BufferedInputStream(input);
        byte[] result = new byte[bufferedInput.available()];
        bufferedInput.read(result, 0, result.length);
        return result;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

在這個方法中,我們首先創建了BufferedInputStream對象bufferedInput,然後調用available()獲取輸入流的位元組數,創建相應大小的byte數組result。最後,調用bufferedInput.read(result, 0, result.length)從輸入流中讀取數據。

四、InputStream轉ByteArray的性能比較

下面的代碼演示了三個方法的性能比較:

public static void main(String[] args) {
    int count = 100;

    long start1 = System.currentTimeMillis();
    for (int i = 0; i < count; i++) {
        InputStream input = new ByteArrayInputStream("Hello World!".getBytes());
        readBytesFromInputStream(input);
    }
    long end1 = System.currentTimeMillis();

    long start2 = System.currentTimeMillis();
    for (int i = 0; i < count; i++) {
        InputStream input = new ByteArrayInputStream("Hello World!".getBytes());
        readBytesFromInputStream2(input);
    }
    long end2 = System.currentTimeMillis();

    long start3 = System.currentTimeMillis();
    for (int i = 0; i < count; i++) {
        InputStream input = new ByteArrayInputStream("Hello World!".getBytes());
        readBytesFromInputStream3(input);
    }
    long end3 = System.currentTimeMillis();

    System.out.println("ByteArrayOutputStream 方法耗時:" + (end1 - start1) + " ms");
    System.out.println("IOUtils.toByteArray 方法耗時:" + (end2 - start2) + " ms");
    System.out.println("BufferedInputStream 方法耗時:" + (end3 - start3) + " ms");
}

private static byte[] readBytesFromInputStream(InputStream input) {
    try {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] buffer = new byte[4096];
        int n = 0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
        }
        return output.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

private static byte[] readBytesFromInputStream2(InputStream input) {
    try {
        return org.apache.commons.io.IOUtils.toByteArray(input);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

private static byte[] readBytesFromInputStream3(InputStream input) {
    try {
        BufferedInputStream bufferedInput = new BufferedInputStream(input);
        byte[] result = new byte[bufferedInput.available()];
        bufferedInput.read(result, 0, result.length);
        return result;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

可以看到,使用ByteArrayOutputStream的方式是最慢的,使用BufferedInputStream的方式較快,而使用IOUtils.toByteArray方法的方式最快。在實際情況中,需要根據自己的需求選擇合適的方法。

五、總結

本文介紹了三種將InputStream轉化為Byte數組的方式,分別是使用ByteArrayOutputStreamByteArrayInputStream以及BufferedInputStream。此外,我們還對三種方法進行了性能比較。在實際使用中需要根據自己的需求選擇最適合的方法。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/186283.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-27 05:45
下一篇 2024-11-27 05:45

相關推薦

  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • Python導入數組

    本文將為您詳細闡述Python導入數組的方法、優勢、適用場景等方面,並附上代碼示例。 一、numpy庫的使用 numpy是Python中一個強大的數學庫,其中提供了非常豐富的數學函…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進制的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進制。 一、AES加密介紹 AE…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 用不同的方法求素數

    素數是指只能被1和自身整除的正整數,如2、3、5、7、11、13等。素數在密碼學、計算機科學、數學、物理等領域都有着廣泛的應用。本文將介紹幾種常見的求素數的方法,包括暴力枚舉法、埃…

    編程 2025-04-29
  • Python返回數組:一次性搞定多種數據類型

    Python是一種多用途的高級編程語言,具有高效性和易讀性的特點,因此被廣泛應用於數據科學、機器學習、Web開發、遊戲開發等各個領域。其中,Python返回數組也是一項非常強大的功…

    編程 2025-04-29
  • Python學習筆記:去除字符串最後一個字符的方法

    本文將從多個方面詳細闡述如何通過Python去除字符串最後一個字符,包括使用切片、pop()、刪除、替換等方法來實現。 一、字符串切片 在Python中,可以通過字符串切片的方式來…

    編程 2025-04-29

發表回復

登錄後才能評論