如何从TStringStream中部分读取,从流中释放读取数据并保留其余部分(未读数据)?

时间:2011-11-21 17:59:34

标签: string delphi stream stringstream

我想做什么:假设我有一个只读取100个字符的字符串的TStringStream。如果我调用.ReadString(50),我将获得此流的前50个字符,并将其光标放在51位。

我的问题是:如何快速,干净地将此流中的字符1到50折腾?我想稍后阅读其余的(51到100)。

提前致谢。

3 个答案:

答案 0 :(得分:2)

你不能这样做。如果你真的需要这样做,你应该编写自己的类来实现流接口,这样可以让你一次处理一些数据并释放你想要释放的任何数据。请注意,您只能浏览一次数据,因为您现在已经删除了数据。也就是说,再次寻求开始将变得不可能,而你当前的流“位置”将是一个谎言。

简而言之,听起来很困惑。

答案 1 :(得分:2)

你无法做你想做的事。字符串流的数据是Delphi字符串,存储为单个内存块。内存块是原子的,不能拆分。你无法释放内存块的某些部分。

如果您确实需要将内存返回到内存管理器,那么您应该创建一个新的字符串,其中已删除已处理的数据。然后,您可以使用此新输入重新创建字符串流,并销毁先前的字符串流。

话虽如此,除了增加内存碎片之外,很难看到除此之外做很多事情。如果所涉及的内存大小足够大,并且如果字符串流持续的时间足够长,那么这可能是一种明智的方法。否则,它听起来像是一种优化的尝试,实际上会妨碍性能。

也许除了字符串流之外的某些类可能更合适,但在不了解更多细节的情况下很难建议。

答案 2 :(得分:1)

如果我理解你在流中向前跳过哪一步?

你可以这样做:

  Str.Position := Str.Position + 50;

或者像这样:

  Str.Seek(50,TSeekOrigin.soCurrent);