【发布时间】:2011-06-22 18:59:44
【问题描述】:
如何使用MemoryStream 将Tbytes 类型转换为Binary file?
【问题讨论】:
-
“使用 MemoryStream”是个陷阱,空间需求翻倍
如何使用MemoryStream 将Tbytes 类型转换为Binary file?
【问题讨论】:
或者直接用TFileStream 来减少创建的中间对象的数量:
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
if Data <> nil then
Stream.WriteBuffer(Data[0], Length(Data));
finally
Stream.Free;
end;
end;
我不认为在这里使用 TMemoryStream 有帮助,因为它只是涉及额外的不必要的堆分配/释放。
【讨论】:
TFileStream 或TMemoryStream.SaveToFile ?
TMemoryStream.SaveToFile 通过TFileStream 完成其工作。最好剪掉中间人,直接去TFileStream。
如果您有可用的 TBytesStream,Uwe 的答案将起作用。如果没有:
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
try
if length(data) > 0 then
stream.WriteBuffer(data[0], length(data));
stream.SaveToFile(FileName);
finally
stream.Free;
end;
end;
【讨论】:
using MemoryStream,我想我应该选择相关的答案。不是吗?
TMemoryStream 是一种比必要的慢的解决方案。当您在评论中询问“哪个更快?”时,这似乎与您相关。
WriteBuffer,因为它具有错误检查功能。我相信你知道这一点,这是一个疏忽。
F.I.在德尔福 XE 中:
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
stream: TBytesStream;
begin
stream := TBytesStream.Create(Data);
try
stream.SaveToFile(FileName);
finally
stream.Free;
end;
end;
【讨论】:
MemoryStream。没区别?
TBytesStream。是复制数据还是引用它?
好吧,如果答案提到 Delphi XE 和 TMemoryStream 以外的其他流,那么我建议另一种方法。
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
begin
TFile.WriteAllBytes( FileName, Data );
end;
【讨论】: