我想做的是:假设我有一个TStringStream,它只读取一个有100个字符的字符串。如果我调用。readstring(50),我将得到这个流的前50个字符,并且它的游标将被放置在位置51上。
我的问题是:我如何在这个流中以快速和干净的方式抛出字符1到50 ?我想稍后再读剩下的(51到100)。
你不能做你希望做的事。字符串流的数据是Delphi字符串,存储在单个内存块中。内存块是原子的,它们不能被分割。您无法释放内存块的某些部分。
如果你真的需要将内存返回给内存管理器,那么你应该创建一个新的字符串,删除已经处理过的数据。然后,你可以用这个新的输入重新创建字符串流,并销毁之前的字符串流。
话虽这么说,但除了增加内存碎片之外,很难看出这做了什么。如果涉及的内存足够大,并且字符串流持续的时间足够长,那么这可能是一种明智的方法。否则,它听起来像是在尝试优化,实际上会阻碍性能。
也许其他类比字符串流更合适,但在不了解更多细节的情况下很难给出建议。
你不能这么做。如果您确实需要这样做,您应该编写自己的类来实现流接口,它将允许您每次处理一些数据并释放您想要释放的任何数据。注意,您只能浏览数据一次,因为您现在已经删除了数据。也就是说,重新寻找开始将变得不可能,并且您当前的流"位置"将是一个谎言。
总之,听起来你很困惑。
如果我理解正确,你在流中跳过哪一个?
你可以这样做:
Str.Position := Str.Position + 50;
或者像这样:
Str.Seek(50,TSeekOrigin.soCurrent);