【发布时间】:2018-07-18 13:36:42
【问题描述】:
我有这段代码,我正在将缓冲区读取到内存流中,并且我想将其保存到文件流中。问题是 memoryStream.GetBuffer() 不适用于我的 Delphi 7,因为它是未声明的标识符。
procedure Dictionary.WriteHeaderObj(filename: String);
var MemStream: TMemoryStream;
i: Integer;
begin
self.fileName := filename;
try
MemStream := TMemoryStream.Create;
try
fsOutput := TFileStream.Create(fileName, fmCreate);
try
MemStream.Write(VAR_META, lengths.VR_META);
for i:=0 to length(buffers)-1 do
MemStream.Write(self.buffers[i].b^,self.buffers[i].l^);
fsOutput.Write(MemStream.GetBuffer(), 0, memoryStream.Position);
finally
MemStream.Free;
end;
finally
fsOutput.Free;
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end;
【问题讨论】:
-
我不明白。从您的示例中,为什么您甚至需要
TMemoryStream并且不将数据直接写入TFileStream?你还泄露了TMemoryStream。 -
您收到范围错误,因为您访问的数组越界。除非单个缓冲区非常小,否则直接写入文件可能会更有效。在内存中创建数据的另一个副本是浪费并且会损害性能。
-
如果不测量实际性能就没有意义。在不同的环境中也是如此。在内存不足或使用不同类型的磁盘时会表现不同。我的猜测是你会发现你实际上会减慢磁盘的速度。如果您准备过早优化,请至少阅读我发布的主题并关注其中的一些链接。
-
综上所述,另一方面,一旦你有了
TMemoryStream,你就可以简单地使用它的SaveToFile方法而不使用TFileStream。所以混合这两种流类型似乎毫无意义。 -
@jerry 但是,如果您一次写入几个字节,那么由于用户模式和内核模式之间的所有切换,性能都会受到影响。这就是我们有时喜欢缓冲输出的原因。
标签: delphi filestream memorystream