[英]Sockets and DataInputStream
我試圖理解這段代碼
DataInputStream stream =
new DataInputStream(
new ByteArrayInputStream(messageBuffer));
int messageLength = stream.readInt();
char recordType = (char) stream.readByte();
byte padding = stream.readByte();
short numberRecords = stream.readShort();
messageBuffer初始化為新字節[32768],通過Socket.read()方法填充。 我不明白的是,一旦messageLength初始化為stream.readInt(),第二個第二個語句將如何工作,即recordType?
第一個語句不會從字節數組的開頭讀取一個int而下一個語句從字節數組的開頭讀取一個字節嗎? 究竟是如何知道從哪個點讀取字節,整數,短路等?
從文檔 :
ByteArrayInputStream
包含一個內部緩沖區,其中包含可從流中讀取的字節。 內部計數器跟蹤read
方法提供的下一個字節。
換句話說, DataInputStream
只是從ByteArrayInputStream
讀取,而后者則記住字節數組中的當前位置,並在每次讀取一些數據時將其前進。
DataInputStream.read*
方法使用基礎輸入流中的字節。 在這種情況下, read*
方法讀取ByteArrayInputStream
提供的下一個可用字節,它將跟蹤數組中的當前位置。
作為旁注,您可能需要考慮使用ByteBuffer.wrap
和各種ByteBuffer.read
方法:
ByteBuffer msgBuf = ByteBuffer.wrap(messageBuffer);
int messageLength = msgBuf.getInt();
char recordType = msgBuf.getChar();
...
readX()
不從流的開頭讀取。 事實上,術語流用於表示隨時間推移可用的數據序列。 這意味着從流中的后續讀取將檢索不同的元素。
將流視為信息的傳送帶而不是陣列。
Socket.read()將讀取可用的字節。 最小值是一個字節! 最大值是緩沖區大小,其中可以包含任意數量的消息。
而不是手動讀取緩沖區,使用DataInputStream / BufferedInputStream更安全,更簡單,更高效。
// create an input stream once per socket.
DataInputStream stream =
new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
int messageLength = stream.readInt();
char recordType = (char) stream.readByte();
byte padding = stream.readByte();
short numberRecords = stream.readShort();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.