如何在Java中将字节数组转换为InputStream和OutputStream
您是否堅(jiān)持使用編碼,因?yàn)槟凶止?jié)數(shù)組,并且鏈中的下一個(gè)方法需要InputStream? 不用擔(dān)心Java有解決方案,您可以使用
ByteArrayInputStream 在Java中將字節(jié)數(shù)組轉(zhuǎn)換為InputStream 。 此類使用字節(jié)數(shù)組作為源,并且由于它是InputStream的子類,因此您可以輕松地將其傳遞給任何接受InputStream作為參數(shù)的方法。 盡管大多數(shù)API(例如JDBC和File API)都允許您直接從InputStream讀取,因?yàn)檫@允許您使用有限的堆空間來處理任意內(nèi)容。 您應(yīng)該利用此優(yōu)勢(shì),直接從InputStream讀取而不是獲取字節(jié)數(shù)組,然后將它們轉(zhuǎn)換回InputStream。 僅適用于您擁有舊代碼而不再維護(hù)和更新的情況。 同樣,將字節(jié)數(shù)組轉(zhuǎn)換為OutputStream也很簡(jiǎn)單。 由于我們使用OutputStream編寫某些內(nèi)容,因此您可以直接在其中寫入字節(jié)數(shù)組。 假設(shè)您從TCP套接字收到了一些消息并希望保留在文件系統(tǒng)中,則可以使用OutputStream和FileOutputStream直接寫入字節(jié)數(shù)組。 前面我們已經(jīng)看到了如何將InputStream轉(zhuǎn)換為字節(jié)數(shù)組 ,在本文中,通過創(chuàng)建一個(gè)將字節(jié)數(shù)組轉(zhuǎn)換為InputStream的簡(jiǎn)單示例,我們將看到相反的結(jié)果。
這是我們的示例程序,該程序首先從String中獲取字節(jié)數(shù)組以進(jìn)行測(cè)試。 無論如何,在將String轉(zhuǎn)換為字節(jié)時(shí)總是提供字符編碼 ,反之亦然。 為了重新創(chuàng)建場(chǎng)景,我創(chuàng)建了一個(gè)靜態(tài)方法,該方法將InputStream轉(zhuǎn)換為String。 此方法稱為streamToString(),該方法采用InputStream和字符編碼來讀取文本。 我們重新創(chuàng)建相同的String,之前已將其轉(zhuǎn)換為字節(jié)數(shù)組。 本示例的下一部分顯示如何將字節(jié)數(shù)組寫入OutputStream 。 順便說一句,如果您不使用try-with-resource語(yǔ)句 ,那么不要忘記在完成Streams后立即關(guān)閉它。 可以說,接受InputStream的方法是否應(yīng)該關(guān)閉它,但出于安全考慮,我已經(jīng)關(guān)閉了它。 讓我知道您對(duì)此有何想法,因?yàn)锳pache Commons IO和Google Guava中都有IO實(shí)用程序類的示例,它們關(guān)閉流,但不關(guān)閉傳遞給它們的流。
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 InputStreamInputStream is = new ByteArrayInputStream(bytes);String stringFromBytes = streamToString(is, StandardCharsets.UTF_8);System.out.println("String recreated from bytes : " + str);// Writing byte array to OutputStreamOutputStream 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轉(zhuǎn)換為String ,但是在此之前,我們已經(jīng)使用ByteArrayInputStream 在Java中將字節(jié)數(shù)組轉(zhuǎn)換為InputStream了 。 正如我所說的,ByteArrayInputStream是InputStream的子類,您可以在需要InputStream時(shí)通過或使用它。 從java.io包中獲得的類層次結(jié)構(gòu)圖也很清楚,該圖顯示了JDK庫(kù)中InputStream的不同實(shí)現(xiàn)。
這就是如何在Java中將字節(jié)數(shù)組轉(zhuǎn)換為InputStream的全部?jī)?nèi)容。 由于對(duì)java.io軟件包的了解有限,一開始聽起來可能很困難,但是一旦您知道有一個(gè)名為ByteArrayInputStream的類,它就變得非常簡(jiǎn)單。 由于它是InputStream的子類,因此可以代替InputStream傳遞它。 如果要將字節(jié)轉(zhuǎn)換為字符并在完成后關(guān)閉流,請(qǐng)不要忘記提供字符編碼。
翻譯自: https://www.javacodegeeks.com/2014/04/how-to-convert-byte-array-to-inputstream-and-outputstream-in-java.html
總結(jié)
以上是生活随笔為你收集整理的如何在Java中将字节数组转换为InputStream和OutputStream的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 讯景推出 RX 7700 XT / 78
- 下一篇: AMD RX 7800 XT 显卡外媒评