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?
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?
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);
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);
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());
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.