我正在嘗試在沒有定義字節數的情況下讀取SocketChannel上的流。在TCP上通過SocketChannel讀取未定義字節數的流
我想過的另一種解決方案是將預定義大小的不同ByteBuffers存儲到一個列表中,這將允許我分配一個新的接收大小的ByteBuffer並將結果放入裏面。
的問題是,我是在阻止模式並不能找到有效的條件離開我所讀出的方法制造的循環檢查代碼:
public static final Charset charsetUTF8 = Charset.forName("UTF-8");
public static final int BUFFER_SIZE = 1024;
public static String getUnbounded(String st, SocketAddress address) throws IOException {
SocketChannel sc = SocketChannel.open(address);
sc.write(charsetUTF8.encode(st));
List<ByteBuffer> listBuffers = new ArrayList<>();
ByteBuffer buff = ByteBuffer.allocate(BUFFER_SIZE);
while(sc.read(buff) > -1){
if(buff.remaining() == 0){
listBuffers.add(buff);
buff.clear();
}
}
listBuffers.add(buff);
ByteBuffer finalBuffer = ByteBuffer.allocate(BUFFER_SIZE * listBuffers.size());
for(ByteBuffer tempBuff: listBuffers){
finalBuffer.put(tempBuff);
tempBuff.clear();
}
finalBuffer.flip();
return charsetUTF8.decode(finalBuffer).toString();
}
如何解決這個任何想法?
爲什麼你覺得需要使用'ByteBuffer'? – kdgregory
任何命題?加上讀取方法只需要ByteBuffer – Hosni
爲什麼要使用通道?您正在阻止IO,並將數據存儲到堆分配的緩衝區中。你真的認爲你通過一個簡單的'SocketInputStream'獲得*任何東西嗎? – kdgregory