天天看點

如何在Java中将位元組數組轉換為InputStream和OutputStream

您是否堅持使用編碼,因為您有位元組數組,并且鍊中的下一個方法需要InputStream? 不用擔心Java有解決方案,您可以使用

ByteArrayInputStream 在Java中将位元組數組轉換為InputStream 。 此類使用位元組數組作為源,并且由于它是InputStream的子類,是以您可以輕松地将其傳遞給任何接受InputStream作為參數的方法。 盡管大多數API(例如JDBC和File API)都允許您直接從InputStream讀取,因為這允許您使用有限的堆空間來處理任意内容。 您應該利用此優勢,直接從InputStream讀取而不是擷取位元組數組,然後将它們轉換回InputStream。 僅适用于您擁有舊代碼而不再維護和更新的情況。 同樣,将位元組數組轉換為OutputStream也很簡單。 由于我們使用OutputStream編寫某些内容,是以您可以直接在其中寫入位元組數組。 假設您從TCP套接字收到了一些消息并希望保留在檔案系統中,則可以使用OutputStream和FileOutputStream直接寫入位元組數組。 前面我們已經看到了如何将InputStream轉換為位元組數組 ,在本文中,通過建立一個将位元組數組轉換為InputStream的簡單示例,我們将看到相反的結果。

這是我們的示例程式,該程式首先從String中擷取位元組數組以進行測試。 無論如何,在将String轉換為位元組時總是提供字元編碼 ,反之亦然。 為了重新建立場景,我建立了一個靜态方法,該方法将InputStream轉換為String。 此方法稱為streamToString(),該方法采用InputStream和字元編碼來讀取文本。 我們重新建立相同的String,之前已将其轉換為位元組數組。 本示例的下一部分顯示如何将位元組數組寫入OutputStream 。 順便說一句,如果您不使用try-with-resource語句 ,那麼不要忘記在完成Streams後立即關閉它。 可以說,接受InputStream的方法是否應該關閉它,但出于安全考慮,我已經關閉了它。 讓我知道您對此有何想法,因為Apache Commons IO和Google Guava中都有IO實用程式類的示例,它們關閉流,但不關閉傳遞給它們的流。

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
 * Java Program to convert byte array to InputStream and OutputStream in Java.
 * Uses ByteArrayInputStream and ByteArrayOutputStream examples.
 * @author Javin Paul
 */
public class ByteArrayToStream {
    public static void main(String args[]) {
        String str = "Google is GOD";
        byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
           
// Creating InputStream from byte array
        // ByteArrayInputStream is sub-class of InputStream
        InputStream is = new ByteArrayInputStream(bytes);
        String stringFromBytes = streamToString(is, StandardCharsets.UTF_8);
        System.out.println("String recreated from bytes : " + str);
           
// Writing byte array to OutputStream
        OutputStream os = new ByteArrayOutputStream();
        try {
            os.write(bytes);
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*
     * Read String from InputStream and closes it
     */
    public static String streamToString(InputStream is, Charset encoding) {
        BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding));
        StringBuilder sb = new StringBuilder(1024);
        try {
            String line = br.readLine();
            while (line != null) {
                sb.append(line);
                line = br.readLine();
            }
        } catch (IOException io) {
            System.out.println("Failed to read from Stream");
            io.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException ioex) {
                System.out.println("Failed to close Streams");
                ioex.printStackTrace();
            }
        }
        return sb.toString();
    }
}
Output:
String recreated from bytes : Google is GOD
           

您可以看到我們的streamToString()方法如何将InputStream轉換為String ,但是在此之前,我們已經使用ByteArrayInputStream 在Java中将位元組數組轉換為InputStream了 。 正如我所說的,ByteArrayInputStream是InputStream的子類,您可以在需要InputStream時通過或使用它。 從java.io包中獲得的類層次結構圖也很清楚,該圖顯示了JDK庫中InputStream的不同實作。

如何在Java中将位元組數組轉換為InputStream和OutputStream

這就是

如何在Java中将位元組數組轉換為InputStream

的全部内容。 由于對java.io軟體包的了解有限,一開始聽起來可能很困難,但是一旦您知道有一個名為ByteArrayInputStream的類,它就變得非常簡單。 由于它是InputStream的子類,是以可以代替InputStream傳遞它。 如果要将位元組轉換為字元并在完成後關閉流,請不要忘記提供字元編碼。

翻譯自: https://www.javacodegeeks.com/2014/04/how-to-convert-byte-array-to-inputstream-and-outputstream-in-java.html