355 Stimmen

Speichern und Laden von MemoryStream in/aus einer Datei

Ich serialisiere eine Struktur in eine MemoryStream und ich möchte die serialisierte Struktur speichern und laden.

Wie rettet man also ein MemoryStream in eine Datei und laden Sie sie auch wieder aus der Datei?

430voto

KV Prajapati Punkte 91877

Sie können verwenden MemoryStream.WriteTo o Stream.CopyTo (unterstützt in Framework Version 4.5.2, 4.5.1, 4.5, 4) Methoden, um den Inhalt eines Speicher-Streams in einen anderen Stream zu schreiben.

memoryStream.WriteTo(fileStream);

Aktualisierung:

fileStream.CopyTo(memoryStream);
memoryStream.CopyTo(fileStream);

320voto

Angenommen, der Name MemoryStream lautet ms .

Dieser Code schreibt den MemoryStream in eine Datei:

using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write)) {
   byte[] bytes = new byte[ms.Length];
   ms.Read(bytes, 0, (int)ms.Length);
   file.Write(bytes, 0, bytes.Length);
   ms.Close();
}

und dieser liest eine Datei in einen MemoryStream ein:

using (MemoryStream ms = new MemoryStream())
using (FileStream file = new FileStream("file.bin", FileMode.Open, FileAccess.Read)) {
   byte[] bytes = new byte[file.Length];
   file.Read(bytes, 0, (int)file.Length);
   ms.Write(bytes, 0, (int)file.Length);
}

In .Net Framework 4+ können Sie einfach FileStream nach MemoryStream kopieren und umgekehrt:

MemoryStream ms = new MemoryStream();
using (FileStream file = new FileStream("file.bin", FileMode.Open, FileAccess.Read))
    file.CopyTo(ms);

Und umgekehrt (MemoryStream zu FileStream):

using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write))
    ms.CopyTo(file);

76voto

Rob Church Punkte 6493

Der Stream sollte wirklich entsorgt werden, auch wenn es eine Ausnahme gibt (sehr wahrscheinlich bei Datei-I/O) - using-Klauseln sind mein bevorzugter Ansatz für diese, so dass für das Schreiben Ihrer MemoryStream, können Sie verwenden:

using (FileStream file = new FileStream("file.bin", FileMode.Create, FileAccess.Write)) {
    memoryStream.WriteTo(file);
}

Und dafür, dass Sie ihn zurücklesen:

using (FileStream file = new FileStream("file.bin", FileMode.Open, FileAccess.Read)) {
    byte[] bytes = new byte[file.Length];
    file.Read(bytes, 0, (int)file.Length);
    ms.Write(bytes, 0, (int)file.Length);
}

Wenn es sich um große Dateien handelt, ist zu beachten, dass der Lesevorgang doppelt so viel Speicherplatz wie die Gesamtgröße der Datei benötigt . Eine Lösung dafür ist, den MemoryStream aus dem Byte-Array zu erstellen - der folgende Code geht davon aus, dass Sie dann nicht in diesen Stream schreiben werden.

MemoryStream ms = new MemoryStream(bytes, writable: false);

Meine Recherchen (unten) zeigen, dass der interne Puffer das gleiche Byte-Array ist, wie Sie es übergeben, so sollte es Speicher sparen.

byte[] testData = new byte[] { 104, 105, 121, 97 };
var ms = new MemoryStream(testData, 0, 4, false, true);
Assert.AreSame(testData, ms.GetBuffer());

63voto

Slai Punkte 20907

Für alle, die nach den Kurzfassungen suchen:

var memoryStream = new MemoryStream(File.ReadAllBytes("1.dat"));

File.WriteAllBytes("1.dat", memoryStream.ToArray());

23voto

Berkay Turancı Punkte 3230

Die kombinierte Antwort für das Schreiben in eine Datei kann lauten;

MemoryStream ms = new MemoryStream();    
FileStream file = new FileStream("file.bin", FileMode.Create, FileAccess.Write);
ms.WriteTo(file);
file.Close();
ms.Close();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X