套接字的DataInputStream的“可用”

uah*_*kan 4 java sockets datainputstream

我在客户端上有以下代码:

DataInputStream dis = new DataInputStream(socketChannel.socket().getInputStream());
while(dis.available()){
     SomeOtherClass.method(dis);
}
Run Code Online (Sandbox Code Playgroud)

但是available()不断返回0,尽管流中有可读数据。因此,在要读取的实际数据完成之后,空数据将传递到另一个要读取的类,这将导致损坏。

经过一番搜索;我发现available()在与套接字一起使用时这是不可靠的,我应该从流中读取前几个字节以实际查看是否有数据可解析。

但就我而言 我必须将DataInputStream我从套接字获得的引用传递给我无法更改的其他类。

是否可以从中读取一些字节DataInputStream而不破坏它,或者有其他建议?

Eer*_*nen 5

在两者之间放置PushbackInputStream可以读取一些字节,而不会破坏数据。

编辑:下面未经测试的代码示例。这是从内存中来的。

static class MyWrapper extends PushbackInputStream {
    MyWrapper(InputStream in) {
        super(in);
    }

    @Override
    public int available() throws IOException {
        int b = super.read();
        // do something specific?
        super.unread(b);
        return super.available();
    }
}

public static void main(String... args) {
    InputStream originalSocketStream = null;
    DataInputStream dis = new DataInputStream(new MyWrapper(originalSocketStream));
}
Run Code Online (Sandbox Code Playgroud)