首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字和DataInputStream

套接字和DataInputStream
EN

Stack Overflow用户
提问于 2011-08-03 21:00:58
回答 4查看 2.2K关注 0票数 3

我正在尝试理解这段代码

代码语言:javascript
复制
        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,而下一条语句不是从字节数组的开头读取一个字节吗?它如何准确地知道从哪个点读取字节、整型、短整型等?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-03 21:02:36

documentation

ByteArrayInputStream包含一个内部缓冲区,其中包含可从流中读取的字节。内部计数器跟踪由 read 方法提供的下一个字节。

换句话说,DataInputStream只是从ByteArrayInputStream读取,而后者记住字节数组中的当前位置,并在每次读取某些数据时前进。

票数 5
EN

Stack Overflow用户

发布于 2011-08-03 21:04:01

DataInputStream.read*方法消耗底层输入流中的字节。在这种情况下,read*方法读取ByteArrayInputStream提供的下一个可用字节,它将跟踪数组中的当前位置。

作为附注,您可能想要考虑使用ByteBuffer.wrap和各种ByteBuffer.read方法:

代码语言:javascript
复制
ByteBuffer msgBuf = ByteBuffer.wrap(messageBuffer);
int messageLength = msgBuf.getInt();
char recordType   = msgBuf.getChar();
...
票数 3
EN

Stack Overflow用户

发布于 2011-08-03 21:05:24

readX()不会从流的开头开始读取。事实上,术语用于表示随着时间的推移而变得可用的数据序列。这意味着后续对流的读取将检索不同的元素。

将流看作是信息的传送带,而不是数组。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6926823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档