簡體   English   中英

如何在Delphi 7中將內存流轉換為文件流?

[英]how to convert memorystream to filestream in Delphi 7?

我有這段代碼,在這里我將緩沖區讀取到內存流中,我想將其保存到文件流中。 問題是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;

您的代碼顯示了一些初學者常見的錯誤。

  1. 確實不需要TMemoryStream 正如David所說,這會損害性能。
  2. 將所有內容都寫入單個TMemoryStream也不是一個好主意,因為您可能會遇到“內存不足”的問題。
  3. 如果緩沖區的大小確實很小,並且使用內存緩沖區是有好處的,則應分兩個循環執行-內部循環將一定數量的數據寫入內存流,而out循環將內存流復制到文件流並清空內存流。
  4. 不幸的是Capacity的(保護) TMemoryStream是無用的,因為TMemoryStream時重新分配內存Size而改變。 使用足夠大的TBytes可以避免重新分配內存,但是您需要跟蹤長度。
  5. 為什么只將標頭對象寫入文件? 您打算稍后將正文附加到文件中嗎? 附加文件通常不是一個好主意。
  6. 瑣碎的事情:始終使用const傳遞string const
  7. 瑣碎的事情:總是以' T '開頭的類型名稱。

這是我的方法:

procedure TDictionary.SaveHeaderToStream(AStream: TStream);
// You want to write to a stream, not a file. This is more reusable.
// You don't want to put the create/free code here,
// this is more flexible as it can also be used by SaveToStream
var
  i: Integer;
begin
  for i := 0 to length(buffers) - 1 do
    AStream.Write(self.buffers[i].b^, self.buffers[i].l^);
end;

procedure TDictionary.SaveHeaderToFile(const Filename: string);
var
  fsOutput: TFileStream;
begin
  fsOutput := TFileStream.Create(Filename, fmCreate);
  try
    SaveHeaderToStream(fsOutput);       // fsOutput IS TStream
  finally
    fsOutput.Free;
  end;
end;

procedure TDictionary.SaveBodyToStream(AStream: TStream);
begin
  // Codes here
end;

procedure TDictionary.SaveToStream(AStream: TStream);
begin
  SaveHeaderToStream(AStream);
  SaveBodyToStream(AStream);
end;

procedure TDictionary.SaveToFile(const Filename: string);
var
  fsOutput: TFileStream;
begin
  fsOutput := TFileStream.Create(Filename, fmCreate);
  try
    SaveToStream(fsOutput);
  finally
    fsOutput.Free;
  end;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM