“可用”从插座DataInputStream类的(“available” of DataInputS

2019-06-27 02:22发布

我在客户端的代码:

DataInputStream dis = new DataInputStream(socketChannel.socket().getInputStream());
while(dis.available()){
     SomeOtherClass.method(dis);
}

available()保持返回0 ,虽然有在流中读取的数据。 所以之后要读取的实际数据结束后,空数据传递到要读取的其他类,这将导致腐败。

经过小的搜索; 我发现, available()与插座使用时是不可靠的,而我应该去阅读前几个字节流从实际上看,如果数据是可用的解析。

但在我的情况; 我必须通过DataInputStream引用我从插座到我不能改变一些其他的类获得。

是否可以读取从几个字节DataInputStream ,而不会破坏它,或其他任何建议吗?

Answer 1:

把一个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));
}


Answer 2:

这应该工作:

PushbackInputStream pbi = new PushbackInputStream(socketChannel.socket().getInputStream(), 1);
int singleByte;
DataInputStream dis = new DataInputStream(pbi);
while((singleByte = pbi.read()) != -1) {
    pbi.unread(singleByte);
    SomeOtherClass.method(dis);
}

但请注意,此代码的行为从不同的例子可用(如果速效会工作),因为可不会阻止,但读可能阻塞。



Answer 3:

available()保持返回0,虽然有在流中读取的数据

如果available()返回零,或者:

  1. 您使用的是不支持的输入流available()所以它只是返回零。 这是不是这里的情况,因为你用的是DataInputStream直接缠套接字的输入流,并且该配置不支持available()或者......

  2. 有流中没有可读数据。 这似乎是这里的情况。 事实上,你可以知道有唯一可能的方式是在流中读取数据,而无需实际读取它调用available()并得到一个积极的结果。 有说服力的没有别的办法。

有很少正确使用availabe()这是不是其中之一。 为什么要掉下来的是循环的,只是因为没有插座的任何数据接收缓冲区? 你应该走出这个循环的唯一方法是通过获取流终止条件。

我应该读前几个字节流从实际上看,如果数据是可用的解析。

这甚至没有意义。 如果你可以从流中读取任何东西,有数据可用,如果你不能,没有。

只要阅读,块,并正确应对EOS,在它的各种表现。



文章来源: “available” of DataInputStream from Socket