【问题标题】:How to encode bytes to a string in Java如何在Java中将字节编码为字符串
【发布时间】:2012-07-11 17:24:44
【问题描述】:

我正在尝试将输入流中的字节编码为纯文本字符。所以,我用空格分隔的整数组成了字符串,如下所示:

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

但问题是,这使得字符串比原始字节大 3-4 倍。有没有其他方法可以将字节编码为纯文本?

【问题讨论】:

    标签: java string byte encode


    【解决方案1】:

    如果我理解正确,您想将二进制数据转换为纯文本。您应该为此使用 Base64。损失系数只有 4/3。

    Apache commons-codec 有一个 Base64 编码器(和解码器)的免费实现。

    另一种可能是十六进制编码(commons-codec 也支持),但每个二进制数据字节需要 2 个字节的文本。

    【讨论】:

    • 谢谢。这就是我要找的。​​span>
    【解决方案2】:

    您可以获取所有字节并将它们输出到一个字节数组中,然后使用字节数组创建字符串。

    String newString = new String(byteArray);
    

    【讨论】:

      【解决方案3】:

      您当前的解决方案生成的字符串比文件中的内容长 3..4 倍,因为它将十进制字符代码连接成一个字符串。

      Java 提供了一种无需编写循环即可从流中读取字符串的方法,如下所示:

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

      【讨论】:

      • 没有循环?如果不止一行怎么办?
      • @ametren OP 的 sn-p 只读取一个字符串。对于多行文件,您可以使用readAllLines 来避免读取循环。
      【解决方案4】:

      关注文档here

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

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

      【讨论】:

        【解决方案5】:

        Commons-codec 有 methods 将字节编码为 Base64 编码。

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

        【讨论】:

          【解决方案6】:

          如果您可以将所有内容集中到一个 byte[] 中,那么应该就是

          new String(byteArray, StandardCharsets.UTF_16LE);
          

          或您希望输入使用的任何字符编码。

          【讨论】:

          • 这还具有不重复字符串连接的优点,因为Java只有不可变的字符串,效率较低。
          • 公平地说,将输入读入byte[] 也有类似的困难。也就是说,使用 ByteStreams.toByteArray(InputStream) 和 Guava 这样的实用程序相当简单。
          • 它会,但至少你可以分配一些预定量的空间,并且扩展通常一次超过一个字节;)
          • 我认为这不是 OP 所追求的。如果我理解正确的话,他想将二进制数据转换为纯文本。
          • ...老实说,我不相信 OP 知道他们所追求的什么。我最好的猜测是他们想要“将字节转换为文本的任何可逆方式。”
          猜你喜欢
          • 2012-12-20
          • 2020-05-22
          • 1970-01-01
          • 2014-02-26
          • 2018-06-21
          • 1970-01-01
          • 2020-07-05
          • 1970-01-01
          相关资源
          最近更新 更多