我試圖將輸入流中的字節編碼爲純文本字符。所以,我做了串出,以空格分隔,這樣一個int:如何在Java中將字節編碼爲字符串
InputStream in;
//etc
int b;
String finalString="";
while((b=in.read())!=-1)finalString+=""+b+" ";
in.close()
但問題是,這使得該字符串比原來字節的3-4倍。有沒有其他方式將字節編碼爲純文本?
我試圖將輸入流中的字節編碼爲純文本字符。所以,我做了串出,以空格分隔,這樣一個int:如何在Java中將字節編碼爲字符串
InputStream in;
//etc
int b;
String finalString="";
while((b=in.read())!=-1)finalString+=""+b+" ";
in.close()
但問題是,這使得該字符串比原來字節的3-4倍。有沒有其他方式將字節編碼爲純文本?
如果我理解正確的,你要的二進制數據轉換爲純文本。你應該使用Base64。損失係數只有4/3。
Apache commons-codec有一個免費的Base64編碼器(和解碼器)。
另一種可能性是十六進制編碼(commons-codec也支持),但是它需要每個字節的二進制數據有2個字節的文本。
如果你能得到這一切到一個單一的byte[]
,那麼這應該只是
new String(byteArray, StandardCharsets.UTF_16LE);
或任何字符編碼,你所期望的輸入使用。
這也有不做重複字符串連接的優點,因爲Java只有不可變的字符串,效率會更低。 – TheZ 2012-07-11 17:28:05
公平地說,將輸入讀入'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
它會,但至少你可以分配一些預定的空間,並且擴展通常每次超過一個字節;) – TheZ 2012-07-11 17:31:22
您可以獲取所有字節並將它們輸出到字節數組中,然後使用字節數組創建字符串。
即
String newString = new String(byteArray);
您當前的解決方案生成的字符串比文件長3..4倍,因爲它將十進制字符代碼連接成一個字符串。
Java提供的閱讀從流串,而無需編寫循環的方式,像這樣:
InputStream in;
BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF8"));
String s = r.readLine();
沒有循環?如果有多條線路會怎麼樣? – ametren 2012-07-11 17:33:38
@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
按照文檔here
例如,如果你的字符串是UTF8:
byte[] bytes = // you got that from somewhere...
String x = new String(bytes, "UTF8");
Commons-codec有methods將字節編碼爲Base64編碼。
encodedText = new String(
org.apache.commons.codec.binary.Base64.encodeBase64(byteArray));
謝謝。這是我正在尋找的。 – DankMemes 2012-07-12 17:52:17
@downvoter:謹慎評論你的投票嗎? – 2012-07-13 09:55:28