我正在序列化一个结构到MemoryStream,我想保存和加载序列化结构。

那么,如何保存一个MemoryStream到一个文件,也从文件加载回来?


当前回答

你可以使用MemoryStream。写到或流。CopyTo(在框架版本4.5.2,4.5.1,4.5,4中支持)将内存流的内容写入另一个流的方法。

memoryStream.WriteTo(fileStream);

更新:

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

其他回答

你可以使用MemoryStream。写到或流。CopyTo(在框架版本4.5.2,4.5.1,4.5,4中支持)将内存流的内容写入另一个流的方法。

memoryStream.WriteTo(fileStream);

更新:

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

假设MemoryStream名称为ms。

这段代码将MemoryStream写入一个文件:

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();
}

它将一个文件读到MemoryStream:

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);
}

在.Net Framework 4+中,你可以简单地将FileStream复制到MemoryStream中,并像下面这样简单地反向:

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

和反向(内存流到文件流):

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

写入文件的组合答案可以是;

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

即使有异常(很可能在文件I/O上),流也应该被处理掉-使用子句是我最喜欢的方法,所以为了写你的MemoryStream,你可以使用:

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

对于读回它:

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);
}

如果文件很大,那么值得注意的是,读取操作将使用的内存是总文件大小的两倍。一种解决方案是从字节数组创建MemoryStream -下面的代码假设您不会写入该流。

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

我的研究(如下)表明,内部缓冲区是相同的字节数组,因为你传递它,所以它应该节省内存。

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

对于那些想要简短版本的人来说:

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

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