2012-07-11 56 views
1

我試圖將輸入流中的字節編碼爲純文本字符。所以,我做了串出,以空格分隔,這樣一個int:如何在Java中將字節編碼爲字符串

InputStream in; 
//etc 
int b; 
String finalString=""; 
while((b=in.read())!=-1)finalString+=""+b+" "; 
in.close() 

但問題是,這使得該字符串比原來字節的3-4倍。有沒有其他方式將字節編碼爲純文本?

回答

2

如果我理解正確的,你要的二進制數據轉換爲純文本。你應該使用Base64。損失係數只有4/3。

Apache commons-codec有一個免費的Base64編碼器(和解碼器)。

另一種可能性是十六進制編碼(commons-codec也支持),但是它需要每個字節的二進制數據有2個字節的文本。

+0

謝謝。這是我正在尋找的。 – DankMemes 2012-07-12 17:52:17

+0

@downvoter:謹慎評論你的投票嗎? – 2012-07-13 09:55:28

1

如果你能得到這一切到一個單一的byte[],那麼這應該只是

new String(byteArray, StandardCharsets.UTF_16LE); 

或任何字符編碼,你所期望的輸入使用。

+0

這也有不做重複字符串連接的優點,因爲Java只有不可變的字符串,效率會更低。 – TheZ 2012-07-11 17:28:05

+0

公平地說,將輸入讀入'byte []'也有類似的困難。也就是說,對於像''ByteStreams.toByteArray(InputStream)']這樣的工具來說相當簡單[](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/io/ ByteStreams.html#toByteArray(java.io.InputStream))與番石榴。 – 2012-07-11 17:30:18

+0

它會,但至少你可以分配一些預定的空間,並且擴展通常每次超過一個字節;) – TheZ 2012-07-11 17:31:22

1

您可以獲取所有字節並將它們輸出到字節數組中,然後使用字節數組創建字符串。

String newString = new String(byteArray); 
1

您當前的解決方案生成的字符串比文件長3..4倍,因爲它將十進制字符代碼連接成一個字符串。

Java提供的閱讀從流串,而無需編寫循環的方式,像這樣:

InputStream in; 
BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF8")); 
String s = r.readLine(); 
+0

沒有循環?如果有多條線路會怎麼樣? – ametren 2012-07-11 17:33:38

+0

@ametren OP的代碼片段只能讀取一個字符串。對於多行文件,您可以使用['readAllLines'](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllLines%28java.nio.file.Path ,%20java.nio.charset.Charset%29)以避免讀取循環。 – dasblinkenlight 2012-07-11 17:41:12

1

按照文檔here

例如,如果你的字符串是UTF8:

byte[] bytes = // you got that from somewhere... 
String x = new String(bytes, "UTF8"); 
1

Commons-codec有methods將字節編碼爲Base64編碼。

encodedText = new String(
       org.apache.commons.codec.binary.Base64.encodeBase64(byteArray)); 
相關問題