Delphi 如何将字节转换为二进制文件?(使用MemoryStream)
如何使用Delphi 如何将字节转换为二进制文件?(使用MemoryStream),delphi,file,binary,stream,Delphi,File,Binary,Stream,如何使用MemoryStream将t字节类型转换为二进制文件?Delphi XE中的F.i.: procedure SaveBytesToFile(const Data: TBytes; const FileName: string); var stream: TBytesStream; begin stream := TBytesStream.Create(Data); try stream.SaveToFile(FileName); finally strea
MemoryStream
将t字节
类型转换为二进制文件
?Delphi XE中的F.i.:
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;
如果您有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;
或者直接使用
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;
过程SaveBytesToFile(常量数据:TBytes;常量文件名:string);
变量
流:TFileStream;
开始
Stream:=TFileStream.Create(文件名,fmCreate);
尝试
如果数据为零,则
Stream.WriteBuffer(数据[0],长度(数据));
最后
免费;
结束;
结束;
我不认为在这里使用
TMemoryStream
是有帮助的,因为它只涉及额外的不必要的堆分配/释放。好吧,如果答案提到Delphi XE和其他流而不是TMemoryStream
,那么我建议另外一种方法
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
begin
TFile.WriteAllBytes( FileName, Data );
end;
谢谢,但我说:
MemoryStream
。没有区别?是的,你是对的。但我只是想看看这是怎么可能的。当你使用SaveToFile时,TBytesStream或TMemoryStream会在后台创建一个TFileStream。像大卫·赫弗南(David Heffernan)所展示的那样,直接向TFileStream写信可能更好。我的回答的全部目的是表明,当你碰巧知道RTL时,答案实际上就在你的脚下。我不关心速度或内存方面的考虑,因为这不是问题的一部分。通常我会在必要时开始优化速度和空间。@Uwe我不知道tbytestream
。是复制数据还是引用数据?谢谢David:)。哪一个更快?使用TFileStream
或TMemoryStream.SaveToFile
?TMemoryStream.SaveToFile
通过TFileStream
执行其工作。最好删去中间人,直接转到代码> TFILTSTRAM 。您可以考虑最后将IF子句移到尝试之外,因此,如果不编写任何内容,流将根本不会被创建。@您仍然需要创建一个空文件,而且由于这段代码做得很好,我不愿意为可能是罕见的情况添加另一个测试。为可能是罕见的情况添加另一个测试。@Kermia您知道您已经接受了最坏的答案性能特征@梅森,请不要生气!标题是:使用MemoryStream
,我想我应该选择相关的答案。大卫:对于这个特殊的案子,是的。但是,如果有大量的单独写入,而不是一次写入,特别是如果它们是小的写入,则可以通过先将所有内容写入内存流,然后立即将其块写入文件来节省大量时间。@Kermia我对您接受的答案没有问题。我只是想确定您是否清楚,使用TMemoryStream
是一种比必要的速度慢的解决方案。当你在评论中问到“哪个更快?”时,这似乎与你有关。您使用了错误的写入方法。您应该改用WriteBuffer
,因为它是带有错误检查的。我相信您知道这一点,这是一个疏忽。“使用MemoryStream”是一个陷阱,使空间需求加倍