保存并从一个文件中加载MemoryStream

我将一个结构序列化成一个MemoryStream ,我想保存并加载序列化的结构。

那么,如何将一个MemoryStream保存到一个文件中,并从文件中加载回来呢?

您可以使用MemoryStream.WriteToStream.CopyTo (支持框架版本Stream.CopyTo )方法将内存stream的内容写入另一个stream。

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

和反向(MemoryStream到FileStream):

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

即使有一个exception(很可能是文件I / O),stream应该真的被丢弃 – 使用子句是我最喜欢的方法,所以为了编写你的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); } 

如果文件很大,那么值得注意的是读取操作将使用两倍于总文件大小的内存 。 一个解决scheme是从字节数组中创buildMemoryStream – 以下代码假定您不会写入该stream。

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

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

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

对于任何寻找短版本的人:

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

为了加载文件,我更喜欢这个

 MemoryStream ms = new MemoryStream(); using (FileStream fs = File.OpenRead(file)) { fs.CopyTo(ms); } 

保存到文件中

 Car car = new Car(); car.Name = "Some fancy car"; MemoryStream stream = Serializer.SerializeToStream(car); System.IO.File.WriteAllBytes(fileName, stream.ToArray()); 

从文件加载

 using (var stream = new MemoryStream(System.IO.File.ReadAllBytes(fileName))) { Car car = (Car)Serializer.DeserializeFromStream(stream); } 

哪里

 using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace Serialization { public class Serializer { public static MemoryStream SerializeToStream(object o) { MemoryStream stream = new MemoryStream(); IFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, o); return stream; } public static object DeserializeFromStream(MemoryStream stream) { IFormatter formatter = new BinaryFormatter(); stream.Seek(0, SeekOrigin.Begin); object o = formatter.Deserialize(stream); return o; } } } 

原本这个class的实施已经在这里贴出来了

 [Serializable] public class Car { public string Name; } 

我使用面板控件添加图像甚至streamvideo,但您可以将图像保存为SQL Server上的图像或MySQL作为largeblob 。 这段代码对我很有用。 一探究竟。

在这里你保存图像

 MemoryStream ms = new MemoryStream(); Bitmap bmp = new Bitmap(panel1.Width, panel1.Height); panel1.DrawToBitmap(bmp, panel1.Bounds); bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); // here you can change the Image format byte[] Pic_arr = new byte[ms.Length]; ms.Position = 0; ms.Read(Pic_arr, 0, Pic_arr.Length); ms.Close(); 

在这里你可以加载,但我使用了一个PictureBox控件。

 MemoryStream ms = new MemoryStream(picarr); ms.Seek(0, SeekOrigin.Begin); fotos.pictureBox1.Image = System.Drawing.Image.FromStream(ms); 

希望有帮助。