保存并从一个文件中加载MemoryStream
我将一个结构序列化成一个MemoryStream
,我想保存并加载序列化的结构。
那么,如何将一个MemoryStream
保存到一个文件中,并从文件中加载回来呢?
您可以使用MemoryStream.WriteTo
或Stream.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);
希望有帮助。