我正在尝试理解这段代码
DataInputStream stream =
new DataInputStream(
new ByteArrayInputStream(messageBuffer));
int messageLength = stream.readInt();
char recordType = (char) stream.readByte();
byte padding = stream.readByte();
short numberRecords = stream.readShort();通过Socket.read()方法将messageBuffer初始化为新的byte32768。我不明白的是,一旦messageLength被初始化为stream.readInt(),第二个语句(即recordType )将如何工作?
第一条语句不是从字节数组的开头读取一个int,而下一条语句不是从字节数组的开头读取一个字节吗?它如何准确地知道从哪个点读取字节、整型、短整型等?
发布于 2011-08-03 21:02:36
从documentation
ByteArrayInputStream包含一个内部缓冲区,其中包含可从流中读取的字节。内部计数器跟踪由read方法提供的下一个字节。
换句话说,DataInputStream只是从ByteArrayInputStream读取,而后者记住字节数组中的当前位置,并在每次读取某些数据时前进。
发布于 2011-08-03 21:04:01
DataInputStream.read*方法消耗底层输入流中的字节。在这种情况下,read*方法读取ByteArrayInputStream提供的下一个可用字节,它将跟踪数组中的当前位置。
作为附注,您可能想要考虑使用ByteBuffer.wrap和各种ByteBuffer.read方法:
ByteBuffer msgBuf = ByteBuffer.wrap(messageBuffer);
int messageLength = msgBuf.getInt();
char recordType = msgBuf.getChar();
...发布于 2011-08-03 21:05:24
readX()不会从流的开头开始读取。事实上,术语流用于表示随着时间的推移而变得可用的数据序列。这意味着后续对流的读取将检索不同的元素。
将流看作是信息的传送带,而不是数组。
https://stackoverflow.com/questions/6926823
复制相似问题