簡體   English   中英

來自Socket的DataInputStream“可用”

[英]“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()返回零,則:

  1. 您正在使用的輸入流不支持available() ,因此它只返回零。 這不是這里的情況,因為您正在使用直接包裝在套接字輸入流中的DataInputStream ,並且該配置確實支持available() ,OR ...

  2. 流中沒有可讀數據。 這似乎就是這種情況。 實際上,您可以知道流中可讀數據的唯一可能方式是調用available()並獲得正結果。 沒有其他說法。

availabe()正確用法很少,而這不是其中之一。 為什么你應該因為套接字接收緩沖區中沒有任何數據而退出該循環? 你應該擺脫這種循環的唯一方法是獲得流結束條件。

我應該從流中讀取前幾個字節,以實際查看數據是否可用於解析。

這甚至沒有意義。 如果您可以從流中讀取任何內容,則可以獲得數據,如果不能,則不會。

只需在各種表現形式中讀取,阻止並正確響應EOS即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM