文件流Seek以及Read操作的问题(reader.BaseStream.Seek导致文件混乱问题)

 

reader.BaseStream.Seek(position, SeekOrigin.Begin);

看起来没什么问题,但是在实际使用中,只使用这段代码,会导致文件内容读取混乱!

必须使用StreamReader.DiscardBufferedData!!!

原因:

 通过调用DiscardBufferedData示例读取数据之后,可按预期方式工作。 读取前 15 个字符后,位置重置为 2 的偏移量值,则读取所有剩余的字符。 如果您删除对调用DiscardBufferedData,该示例未按预期运行。 读取前 15 个字符,但仅基础流的当前位置重置。 内部缓冲区的StreamReader对象仍位于第 16 个字符。 因此,ReadToEnd缓冲区以及从重置位置开始的基础流中的字符返回的所有字符。

注:

使用DiscardBufferedData方法来重置的内部缓冲区StreamReader对象。 您需要调用此方法时,才内部缓冲区的位置和BaseStream不匹配。 当数据读取到缓冲区,然后寻求基础流中的新位置时,这些位置可以是不匹配。 此方法会降低性能,仅当绝对必要,例如当你想要读取的内容的一部分时才应使用StreamReader对象超过一次。

出处:

https://docs.microsoft.com/zh-cn/dotnet/api/system.io.streamreader.discardbuffereddata?redirectedfrom=MSDN&view=netframework-4.7.2#System_IO_StreamReader_DiscardBufferedData

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值