MemoryStream 클래스
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 |