Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;“可用”;来自套接字的DataInputStream的_Java_Sockets_Datainputstream - Fatal编程技术网

Java &引用;“可用”;来自套接字的DataInputStream的

Java &引用;“可用”;来自套接字的DataInputStream的,java,sockets,datainputstream,Java,Sockets,Datainputstream,我在客户端有以下代码: DataInputStream dis = new DataInputStream(socketChannel.socket().getInputStream()); while(dis.available()){ SomeOtherClass.method(dis); } 尽管流中有可读数据,但仍会不断返回0。因此,在要读取的实际数据完成后,空数据被传递给另一个要读取的类,这会导致损坏 经过一番搜寻;我发现当与套接字一起使用时,available()是不可靠

我在客户端有以下代码:

DataInputStream dis = new DataInputStream(socketChannel.socket().getInputStream());
while(dis.available()){
     SomeOtherClass.method(dis);
}
尽管流中有可读数据,但仍会不断返回
0
。因此,在要读取的实际数据完成后,空数据被传递给另一个要读取的类,这会导致损坏

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

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

是否可以从
数据输入流
中读取几个字节而不损坏它,或者任何其他建议?

在两者之间放置一个值可以让您读取一些字节而不损坏数据

编辑:下面的未测试代码示例。这是来自记忆

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));
}
这应该起作用:

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);
}
但请注意,此代码的行为将不同于available(如果available可以工作)的示例,因为available不会阻塞,而read可能会阻塞

但是
available()
继续返回0,尽管流中有可读数据

如果
available()
返回零,则:

  • 您使用的输入流不支持
    available()
    ,因此它只返回零。这里的情况并非如此,因为您使用的是直接包装在套接字输入流周围的
    DataInputStream
    ,并且该配置支持
    available()
    ,或者

  • 流中没有可读数据。这里似乎就是这样。事实上,您知道流中存在可读数据而不实际读取数据的唯一可能方法是调用
    available()
    ,并获得肯定的结果。没有其他方法可以说明

  • available()
    的正确用法很少,这不是其中之一。为什么仅仅因为套接字接收缓冲区中没有任何数据就要跳出这个循环?您应该退出该循环的唯一方法是获取流结束条件

    我应该从流中读取前几个字节,以实际查看数据是否可用于解析

    这根本没有道理。如果您可以从流中读取任何内容,则有可用的数据,如果您不能,则没有可用的数据


    只要阅读、阻止并正确反应EOS的各种表现形式。

    你说的“中间”是什么意思?我也尝试过PushBackInputStream,但我想知道是否有可能与DataInputStream和PushBackInputStream共享我从套接字获得的相同InputStream?如果您能提供一个代码片段,我将不胜感激……我认为它应该是这样工作的,但自从我实际使用PushbackInputStream以来,已经有很长时间了。您的代码示例肯定更好。。。因为你的帖子已经有几分钟了,而我的帖子已经发布了,所以我认为它不会出现。。投票支持你的答案使用插座时非常可靠。它只是没有达到你的期望。不一样。当没有数据可以不阻塞地读取时,它返回0。请参阅Javadoc。