본문 바로가기
C#

[C#] MemoryStream

by DANEW 2023. 11. 24.

MemoryStream 클래스

 

MemoryStream Class (System.IO)

Creates a stream whose backing store is memory.

learn.microsoft.com

namespace System.IO
{
    public class MemoryStream : Stream
    {
        // 생성자
        public MemoryStream();
        public MemoryStream(int capacity);
        public MemoryStream(byte[] buffer);
        public MemoryStream(byte[] buffer, bool writable);
        public MemoryStream(byte[] buffer, int index, int count);
        public MemoryStream(byte[] buffer, int index, int count, bool writable);
        public MemoryStream(byte[] buffer, int index, int count, bool writable, bool publiclyVisible);

        // 읽기
        public override bool CanRead { get; }
        public override int Read(byte[] buffer, int offset, int count);
        public override int ReadByte();
        public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken);

        // 쓰기
        public override bool CanWrite { get; }
        public override void Write(byte[] buffer, int offset, int count);
        public override void WriteByte(byte value);
        public virtual void WriteTo(Stream stream);
        public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken);
        
        // 탐색
        public override bool CanSeek { get; }
        public override long Position { get; set; }
        public override long Length { get; }
        public override void SetLength(long value);
        public override long Seek(long offset, SeekOrigin loc);

        // 복사
        public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken);

        // 배출, 닫기
        public override void Flush();
        public override Task FlushAsync(CancellationToken cancellationToken);
        protected override void Dispose(bool disposing);

        // 기타
        public virtual int Capacity { get; set; }
        public virtual byte[] ToArray();
        public virtual byte[] GetBuffer();
        public virtual bool TryGetBuffer(out ArraySegment<byte> buffer);
    }
}

 

- Array를 배경 저장소로 사용하기 때문에 스트림 전체를 메모리에 올리게 됨
- 탐색 불가 스트림에 대한 임의 접근을 가능하게 하는 용도로 사용 가능

반응형


- ToArray는 새 배열로 복사하여 레퍼런스를 돌려줌
- GetBuffer는 배경 저장소의 레퍼런스를 돌려줌
 * publiclyVisible이 true여야 함. 생성자에서 지정 가능
 * writable이 false라도 배열에 대해서 수정 가능
 * 받은 배열이 스트림의 실제 길이보다 클 카능성이 높음

byte[] bytes = {1, 2, 3, 4, 5};
var s = new MemoryStream(bytes, 0, 5, false, true);

byte[] toArray = s.ToArray();
byte[] getBuffer = s.GetBuffer();

toArray[0] = 100;
getBuffer[1] = 200;

int result;
do
{
    result = s.ReadByte();
    Console.WriteLine(result);
}
while (result != -1);
Console.WriteLine("===\n");
Console.WriteLine($"toArray.Length: {toArray.Length}");
Console.WriteLine($"getBuffer.Length: {getBuffer.Length}");


- Dispose를 굳이 할 필요 없음 (Dispose 이후 스트림을 수정할 순 없지만 ToArray, GetBuffer는 여전히 동작)
- Flush는 아무 일도 하지 않음

반응형

'C#' 카테고리의 다른 글

[C#] NamedPipeServerStream, NamedPipeClientStream  (0) 2023.12.04
[C#] PipeStream  (0) 2023.12.01
[C#] FileStream  (0) 2023.11.20
[C#] Stream  (0) 2023.11.17
[C#] Task  (0) 2023.11.06
[C#] Thread  (0) 2023.11.01
[C#] Stopwatch  (0) 2023.10.30
[C#] PerformanceCounter, PerformanceCounterCategory  (0) 2023.10.28