파일에 MemoryStream 저장 및 로드
나는 구조물을 연속적으로 하나의MemoryStream
직렬화된 구조를 저장하고 로드합니다.
그래서, 저장하는 방법MemoryStream
파일에 저장하고 파일에서 다시 로드하시겠습니까?
사용할 수 있습니다.MemoryStream.WriteTo
또는Stream.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);
그 반대(MemoryStream to FileStream):
using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write))
ms.CopyTo(file);
예외(파일 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 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());
파일에 쓰기 위한 조합된 답변은 다음과 같습니다.
MemoryStream ms = new MemoryStream();
FileStream file = new FileStream("file.bin", FileMode.Create, FileAccess.Write);
ms.WriteTo(file);
file.Close();
ms.Close();
파일을 로드할 때, 저는 이것이 훨씬 더 좋습니다.
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;
}
}
}
원래 이 클래스의 구현이 여기에 게시되었습니다.
그리고.
[Serializable]
public class Car
{
public string Name;
}
패널 컨트롤을 사용하여 이미지를 추가하거나 비디오를 스트리밍하지만 SQL Server에서 이미지를 이미지로 저장하거나 MySQL을 큰 블로그로 저장할 수 있습니다.이 코드는 저에게 매우 유용합니다.이것을 확인해 보세요.
여기서 이미지를 저장합니다.
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);
희망이 도움이 됩니다.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
namespace ImageWriterUtil
{
public class ImageWaterMarkBuilder
{
//private ImageWaterMarkBuilder()
//{
//}
Stream imageStream;
string watermarkText = "©8Bytes.Technology";
Font font = new System.Drawing.Font("Brush Script MT", 30, FontStyle.Bold, GraphicsUnit.Pixel);
Brush brush = new SolidBrush(Color.Black);
Point position;
public ImageWaterMarkBuilder AddStream(Stream imageStream)
{
this.imageStream = imageStream;
return this;
}
public ImageWaterMarkBuilder AddWaterMark(string watermarkText)
{
this.watermarkText = watermarkText;
return this;
}
public ImageWaterMarkBuilder AddFont(Font font)
{
this.font = font;
return this;
}
public ImageWaterMarkBuilder AddFontColour(Color color)
{
this.brush = new SolidBrush(color);
return this;
}
public ImageWaterMarkBuilder AddPosition(Point position)
{
this.position = position;
return this;
}
public void CompileAndSave(string filePath)
{
//Read the File into a Bitmap.
using (Bitmap bmp = new Bitmap(this.imageStream, false))
{
using (Graphics grp = Graphics.FromImage(bmp))
{
//Determine the size of the Watermark text.
SizeF textSize = new SizeF();
textSize = grp.MeasureString(watermarkText, font);
//Position the text and draw it on the image.
if (position == null)
position = new Point((bmp.Width - ((int)textSize.Width + 10)), (bmp.Height - ((int)textSize.Height + 10)));
grp.DrawString(watermarkText, font, brush, position);
using (MemoryStream memoryStream = new MemoryStream())
{
//Save the Watermarked image to the MemoryStream.
bmp.Save(memoryStream, ImageFormat.Png);
memoryStream.Position = 0;
// string fileName = Path.GetFileNameWithoutExtension(filePath);
// outPuthFilePath = Path.Combine(Path.GetDirectoryName(filePath), fileName + "_outputh.png");
using (FileStream file = new FileStream(filePath, FileMode.Create, System.IO.FileAccess.Write))
{
byte[] bytes = new byte[memoryStream.Length];
memoryStream.Read(bytes, 0, (int)memoryStream.Length);
file.Write(bytes, 0, bytes.Length);
memoryStream.Close();
}
}
}
}
}
}
}
용도 :-
ImageWaterMarkBuilder.AddStream(stream).AddWaterMark("").CompileAndSave(filePath);
언급URL : https://stackoverflow.com/questions/8624071/save-and-load-memorystream-to-from-a-file
'programing' 카테고리의 다른 글
잠금 명령문 본문에서 '대기' 연산자를 사용할 수 없는 이유는 무엇입니까? (0) | 2023.05.01 |
---|---|
프로비저닝 프로파일을 새로 고칠 때 Xcode가 충돌합니다. (0) | 2023.05.01 |
CosmosDb에서 파티션 키에 /id를 사용하는 것의 의미 (0) | 2023.05.01 |
ng-if와 ng-show/ng-hide의 차이점은 무엇입니까? (0) | 2023.05.01 |
Tkinter에서 두 프레임을 전환하시겠습니까? (0) | 2023.05.01 |