[英]“available” of DataInputStream from Socket
我在客戶端有這個代碼:
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);
}
但是請注意,此代碼的行為與可用的示例(如果availablebe可行)有所不同,因為available不會阻塞但read可能會阻塞。
但是,盡管流中有可讀數據,但
available()
仍然返回0
如果available()
返回零,則:
您正在使用的輸入流不支持available()
,因此它只返回零。 這不是這里的情況,因為您正在使用直接包裝在套接字輸入流中的DataInputStream
,並且該配置確實支持available()
,OR ...
流中沒有可讀數據。 這似乎就是這種情況。 實際上,您可以知道流中可讀數據的唯一可能方式是調用available()
並獲得正結果。 沒有其他說法。
availabe()
正確用法很少,而這不是其中之一。 為什么你應該因為套接字接收緩沖區中沒有任何數據而退出該循環? 你應該擺脫這種循環的唯一方法是獲得流結束條件。
我應該從流中讀取前幾個字節,以實際查看數據是否可用於解析。
這甚至沒有意義。 如果您可以從流中讀取任何內容,則可以獲得數據,如果不能,則不會。
只需在各種表現形式中讀取,阻止並正確響應EOS即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.