【问题标题】:How to convert TBytes to Binary File? (using MemoryStream)如何将 TBytes 转换为二进制文件? (使用内存流)
【发布时间】:2011-06-22 18:59:44
【问题描述】:

如何使用MemoryStream 将Tbytes 类型转换为Binary file?

【问题讨论】:

  • “使用 MemoryStream”是个陷阱,空间需求翻倍

标签: delphi file binary stream


【解决方案1】:

或者直接用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。
  • 你可以考虑把 if 子句移到 try finally 之外,这样如果什么都不写,就不会创建流​​。
  • @uwe 你仍然需要创建一个空文件,因为这段代码做得很好,我不愿意为可能是罕见的极端情况添加另一个测试。添加另一个测试这可能是一个罕见的极端情况。
【解决方案2】:

如果您有可用的 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;

【讨论】:

  • @Kermia 您确实意识到您已经接受了性能特征最差的答案? @Mason 请不要生气!
  • 标题说:using MemoryStream,我想我应该选择相关的答案。不是吗?
  • @David:对于这种特殊情况,是的。但是,如果有很多单独的写入,而不是只有一个,特别是如果它们是小写入,您可以通过先将所有内容写入内存流然后将其块写入一次性归档。
  • @Kermia 我对您接受哪个答案没有任何问题。我只是想确保您清楚使用TMemoryStream 是一种比必要的慢的解决方案。当您在评论中询问“哪个更快?”时,这似乎与您相关。
  • @Mason An 放在一边。您使用了错误的写入方法。您应该改用WriteBuffer,因为它具有错误检查功能。我相信你知道这一点,这是一个疏忽。
【解决方案3】:

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。没区别?
  • 是的,你是对的。但我只是想看看这怎么可能。
  • 当您使用 SaveToFile 时,TBytesStream 或 TMemoryStream 在幕后创建 TFileStream。像 David Heffernan 展示的那样,直接写入 TFileStream 可能会更好。
  • 我回答的全部目的是表明,当您碰巧知道 RTL 时,答案实际上就在您的脚下。我不关心速度或内存方面的考虑,因为这不是问题的一部分。通常我会在必要时开始优化速度和空间。
  • @Uwe 我不知道TBytesStream。是复制数据还是引用它?
【解决方案4】:

好吧,如果答案提到 Delphi XE 和 TMemoryStream 以外的其他流,那么我建议另一种方法。

 procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
 begin
   TFile.WriteAllBytes( FileName, Data );
 end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2018-11-03
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2015-11-07
    • 2017-06-28
    相关资源
    最近更新 更多