如何从外部流中访问数据

时间:2016-08-30 13:23:21

标签: java inputstream

Web服务正在提供二进制文件chunked application/octet-stream。 我必须在java中构建一个阅读客户端。我从一些文档中了解了结构,并希望将该流用作ObjectInputStream,但在我可以调用任何自制的readObject方法之前,由于java.io.StreamCorruptedException: invalid stream header,这种方法失败了。

从这样的字节流中填充java对象的最佳方法是什么?

BTW:数据以LittleEndian形式出现,文本为16位字符,前面是4字节大小信息,例如:

  

03 00 00 00 41 00 62 00 63 00(hex)

会导致“Abc”

1 个答案:

答案 0 :(得分:0)

有时从头开始(或使用您已知的工具)比搜索更复杂的解决方案更快。 我只是创建了自己的专用DataInputStream:

import java.io.IOException;
import java.io.InputStream;

public class LittleEndianInputStream {
    private InputStream s;  

    public LittleEndianInputStream (InputStream in) { s = in; }

    boolean readBoolean() throws IOException {return (s.read() == 1);}

    int readInt() throws IOException {return s.read() | s.read() << 8 | s.read() << 16 | s.read() << 24; }

    char readChar() throws IOException {return (char)(s.read() | s.read() << 8); }

    String readString() throws IOException {
        int len = readInt();
        char [] tarray = new char[len];
        for (int i = 0; i < len; i++ ) tarray[i] = readChar();
        return new String(tarray);
    }
}

根据需要扩展以获得更多数据类型......

仍然欢迎替代解决方案;)