2012-07-11 66 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)); 
相关问题