首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >multiple BinaryReader.Read()和BinaryReader.ReadBytes(int i)之间的区别

multiple BinaryReader.Read()和BinaryReader.ReadBytes(int i)之间的区别
EN

Stack Overflow用户
提问于 2010-11-02 23:02:02
回答 4查看 3.5K关注 0票数 5

当我遇到这个feature request on msdn时,我正在搜索一个BinaryReader.Skip函数。他说你可以通过使用这个来提供你自己的BinaryReader.Skip()函数。

只看这段代码,我想知道他为什么选择这种方式来跳过一定数量的字节:

代码语言:javascript
复制
    for (int i = 0, i < count; i++) {
        reader.ReadByte();
    }

这两者之间有区别吗:

代码语言:javascript
复制
reader.ReadBytes(count);

即使这只是一个小的优化,我也想理解。因为现在我不明白为什么你要使用for循环。

代码语言:javascript
复制
public void Skip(this BinaryReader reader, int count) {
    if (reader.BaseStream.CanSeek) { 
        reader.BaseStream.Seek(count, SeekOffset.Current); 
    }
    else {
        for (int i = 0, i < count; i++) {
            reader.ReadByte();
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-02 23:04:27

不,没有区别。编辑:假设流有足够的byes

ReadByte方法只是转发到底层流的ReadByte方法。

ReadBytes方法调用基础流的Read,直到它读取所需的字节数为止。

它的定义如下:

代码语言:javascript
复制
public virtual byte[] ReadBytes(int count) {
    if (count < 0) throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); 
    Contract.Ensures(Contract.Result<byte[]>() != null); 
    Contract.Ensures(Contract.Result<byte[]>().Length <= Contract.OldValue(count));
    Contract.EndContractBlock(); 
    if (m_stream==null) __Error.FileNotOpen();

    byte[] result = new byte[count];

    int numRead = 0;
    do { 
        int n = m_stream.Read(result, numRead, count); 
        if (n == 0)
            break; 
        numRead += n;
        count -= n;
    } while (count > 0);

    if (numRead != result.Length) {
        // Trim array.  This should happen on EOF & possibly net streams. 
        byte[] copy = new byte[numRead]; 
        Buffer.InternalBlockCopy(result, 0, copy, 0, numRead);
        result = copy; 
    }

    return result;
} 

对于大多数流,ReadBytes可能会更快。

票数 2
EN

Stack Overflow用户

发布于 2010-11-02 23:06:39

如果到达流的末尾,ReadByte将抛出EndOfStreamException,而ReadBytes不会。这取决于您是否希望Skip在未到达流的末尾时跳过请求的字节数而抛出。

票数 2
EN

Stack Overflow用户

发布于 2010-11-02 23:18:05

ReadBytes比多个ReadByte调用更快。

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

https://stackoverflow.com/questions/4078936

复制
相关文章

相似问题

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