2014-06-05 21 views
11

我讀this post但我沒有關注。我看過this,但還沒有看到使用ByteArrayOutputStreamByteArrayInputStream轉換爲String的適當示例。將ByteArrayInputStream的內容轉換爲字符串

要檢索ByteArrayInputStream的內容爲String,正在使用推薦的ByteArrayOutputstream還是有更好的方法?

我正在考慮this example並延伸ByteArrayInputStream並利用Decorator增加運行時的功能。對此的任何興趣是使用ByteArrayOutputStream的更好解決方案?

+1

您可能需要一個'InputStreamReader',如您在第二個鏈接中所述。 'ByteArrayOutputStream'不會將字節轉換爲字符。 –

+0

你真的有一個ByteArrayInputStream(這意味着你有一個字節[]),或者你只是有一個InputStream? –

+0

@BrettOkken我確實有一個ByteArrayInputStream,它的構造函數被傳遞了一個字節數組(大小變化) – Mushy

回答

23

一個ByteArrayOutputStream可以從任何InputStream,並在年底產量byte[]讀取。

然而與ByteArrayInputStream它更簡單:

int n = in.available(); 
byte[] bytes = new byte[n]; 
in.read(bytes, 0, n); 
String s = new String(bytes, StandardCharsets.UTF_8); // Or any encoding. 

對於ByteArrayInputStreamavailable()產生的總字節數。


答發表評論:使用ByteArrayOutputStream

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] buf = new byte[8192]; 
for (;;) { 
    int nread = in.read(buf, 0, buf.length); 
    if (nread <= 0) { 
     break; 
    } 
    baos.write(buf, 0, nread); 
} 
in.close(); 
baos.close(); 
byte[] bytes = baos.toByteArray(); 

在這裏,可以是任何的InputStream。

+1

ByteArrayOutputStream如何從ByteArrayInputStream中讀取? – Mushy

+1

我已經延長了答案。原則上,循環讀取'InputStream'並寫入'ByteArrayOutputStream'。在傳統之外,I/O緩衝器的儀式尺寸是2的冪。 –

+0

同意2尺寸的冪;我喜歡這一點,並感謝你。 – Mushy

1

使用Scanner並從掃描儀傳遞給它的構造函數中ByteArrayInputStream然後讀取數據,檢查這個例子:

ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(new byte[] { 65, 80 }); 
Scanner scanner = new Scanner(arrayInputStream); 
scanner.useDelimiter("\\Z");//To read all scanner content in one String 
String data = ""; 
if (scanner.hasNext()) 
    data = scanner.next(); 
System.out.println(data); 
+0

如果我有'XML'或'HTML'文檔,我能夠無限制地閱讀它嗎? – Mushy

+0

是的,沒有限制。 – Mifmif

1

使用Base64編碼

假設你有你的ByteArrayOutputStream:

ByteArrayOutputStream baos =... 
String s = new String(Base64.Encoder.encode(baos.toByteArray())); 

http://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html

+0

不錯的解決方案。但是,我需要首先將我的ByteArrayInputStream連接到我的ByteArrayOutputStream。這是如何完成的? – Mushy

+1

重要的是說Base64.Encoder是在Java 8中發佈的。:) – Jacobi

+0

它應該是String s = new String(Base64.getEncoder()。encode(baos.toByteArray()));謝謝。 –

6

爲什麼沒有人提到org.apache.commons.io.IOUtils

import java.nio.charset.StandardCharsets; 
import org.apache.commons.io.IOUtils; 

String result = IOUtils.toString(in, StandardCharsets.UTF_8); 

只需一行代碼。

+0

我添加了兩個必需的'import'語句,以便不是每個人都必須搜索它們。對不起......這不僅僅是一行代碼;) – dokaspar