我在客户端的代码:
DataInputStream dis = new DataInputStream(socketChannel.socket().getInputStream());
while(dis.available()){
SomeOtherClass.method(dis);
}
但available()
保持返回0
,虽然有在流中读取的数据。 所以之后要读取的实际数据结束后,空数据传递到要读取的其他类,这将导致腐败。
经过小的搜索; 我发现, available()
与插座使用时是不可靠的,而我应该去阅读前几个字节流从实际上看,如果数据是可用的解析。
但在我的情况; 我必须通过DataInputStream
引用我从插座到我不能改变一些其他的类获得。
是否可以读取从几个字节DataInputStream
,而不会破坏它,或其他任何建议吗?
把一个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));
}
这应该工作:
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()
保持返回0,虽然有在流中读取的数据
如果available()
返回零,或者:
您使用的是不支持的输入流available()
所以它只是返回零。 这是不是这里的情况,因为你用的是DataInputStream
直接缠套接字的输入流,并且该配置不支持available()
或者......
有流中没有可读数据。 这似乎是这里的情况。 事实上,你可以知道有唯一可能的方式是在流中读取数据,而无需实际读取它调用available()
并得到一个积极的结果。 有说服力的没有别的办法。
有很少正确使用availabe()
这是不是其中之一。 为什么要掉下来的是循环的,只是因为没有插座的任何数据接收缓冲区? 你应该走出这个循环的唯一方法是通过获取流终止条件。
我应该读前几个字节流从实际上看,如果数据是可用的解析。
这甚至没有意义。 如果你可以从流中读取任何东西,有数据可用,如果你不能,没有。
只要阅读,块,并正确应对EOS,在它的各种表现。