【问题标题】:Read both text and binary data from InputStream [duplicate]从 InputStream 中读取文本和二进制数据 [重复]
【发布时间】:2011-09-25 17:49:42
【问题描述】:

我正在尝试从二进制流中读取数据,其中的一部分应该被解析为 UTF-8。

直接将InputStream 用于二进制数据并在其顶部使用InputStreamReader 用于UTF-8 文本不起作用,因为即使被告知阅读器也会提前阅读并弄乱后续的二进制数据最多读取n 个字符。

我认识到这个问题与Read from InputStream in multiple formats 非常相似,但是那里提出的解决方案是针对 HTTP 流的,这对我没有帮助。

我想只是将所有内容都读取为二进制数据,然后将相关部分转换为文本。但我只有字符数据的长度信息,而不是字节。因此,我需要从流中读取字符的东西来了解编码。

有没有办法告诉 InputStreamReader 不要提前读取超过读取给定字符数所需的内容?或者有没有一种阅读器可以同时支持二进制数据和带有编码的文本,并且可以在这些模式之间动态切换?

【问题讨论】:

    标签: java inputstream inputstreamreader


    【解决方案1】:

    您需要先阅读二进制部分。如果您识别出需要 UTF-8 解码的部分字节,您需要提取这些字节并对其进行解码。

    DataInputStream dis = 
    // read a binary type.
    int num = dis.readInt();
    int len = dis.readUnsignedShort();
    // read a UTF-8 portion.
    byte[] bytes = new byte[len];
    dis.readFully(bytes);
    String text = new String(bytes, "UTF-8");
    // read some binary
    double d = dis.readDouble();
    

    【讨论】:

    • 问题是,对于 UTF8,字节数可能与字符数不同。所以我需要找出字符串中多字节字符的数量,读取更多字节并再次转换并一遍又一遍地执行此操作,直到数字匹配。
    • 我会说你的格式不是很容易解码,如果可以的话我会修复它。但是,如果您知道字符数,您可以自己解析 UTF-8。 (但发送实际数字字节会简单得多)
    • 另一种方法是读取比需要更多的数据。取预期的字符数,例如substring() 并转换为 UTF-8 以确定长度。使用 mark() 和 reset() 并读取您现在知道的长度。 (这仅在 UTF-8 编码完全相同的情况下才有效:| 例如,nul 字节 \0 以两种不同的方式编码。(其他字符也可以)
    • 一个经验法则是,如果您需要使编码或解码更难,请使编码更难,解码更容易。
    • 好的,我决定更改格式,因为这确实是最简单的方法。
    【解决方案2】:

    我认为你不应该使用 StreamReader。读者处理文本,但您同时处理文本和二进制数据。

    没有办法。您必须自己读取二进制缓冲区并解释您的格式,即找到文本提取字节的位置并将它们转换为字符串。

    为了简化这项任务,我建议您创建自己的类(比如说 ProtocolRecord。)它应该是可序列化的。它将包含您的所有字段。 现在你有两个选择:

    (1)简单一——使用java序列化机制。在这种情况下,您只需使用 DataInputStream 包装您的流以进行读取,并使用 DataOutputStream 进行写入,然后读取/写入您的对象。这种方法的缺点是您无法控制您的协议。

    (2) 自己实现方法 readObject() 和 writeObject()。现在如上所述使用 DataInputStream 和 DataOutputStream。 在这种情况下,您确实必须实现序列化协议,但至少它被封装到您的类中。

    它认为 DataInputStream 是您所需要的。

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2015-06-27
      • 2015-04-23
      • 2018-01-16
      • 1970-01-01
      相关资源
      最近更新 更多