我正在序列化一个结构到MemoryStream,我想保存和加载序列化结构。
那么,如何保存一个MemoryStream到一个文件,也从文件加载回来?
我正在序列化一个结构到MemoryStream,我想保存和加载序列化结构。
那么,如何保存一个MemoryStream到一个文件,也从文件加载回来?
当前回答
对于加载文件,我更喜欢这个
MemoryStream ms = new MemoryStream();
using (FileStream fs = File.OpenRead(file))
{
fs.CopyTo(ms);
}
其他回答
对于加载文件,我更喜欢这个
MemoryStream ms = new MemoryStream();
using (FileStream fs = File.OpenRead(file))
{
fs.CopyTo(ms);
}
即使有异常(很可能在文件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());
写入文件的组合答案可以是;
MemoryStream ms = new MemoryStream();
FileStream file = new FileStream("file.bin", FileMode.Create, FileAccess.Write);
ms.WriteTo(file);
file.Close();
ms.Close();
我使用面板控件来添加图像甚至流视频,但您可以将图像保存在SQL Server为image或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 Control。
MemoryStream ms = new MemoryStream(picarr);
ms.Seek(0, SeekOrigin.Begin);
fotos.pictureBox1.Image = System.Drawing.Image.FromStream(ms);
希望有帮助。
对于那些想要简短版本的人来说:
var memoryStream = new MemoryStream(File.ReadAllBytes("1.dat"));
File.WriteAllBytes("1.dat", memoryStream.ToArray());