Tidak semua stream mengarah ke disk. MemoryStream adalah stream yang menyimpan datanya di memori proses, sehingga tulisan dan bacanya berkecepatan penuh tanpa menyentuh perangkat penyimpanan. Stream ini sering dipakai sebagai wadah uji coba untuk kode yang menyasar stream, sebagai buffer perantara sebelum data dikirim ke jaringan, atau sebagai tempat merakit hasil sebelum ditulis ke berkas.

MemoryStream sebagai Pengganti Berkas #

Karena MemoryStream adalah turunan Stream seperti FileStream, kode yang menulis ke stream bisa diarahkan ke salah satunya tanpa perubahan. Method ToArray() menyalin isi yang sudah tertulis menjadi byte[], dan constructor MemoryStream(byte[]) membuat stream baru di atas data tersebut sehingga isinya bisa dibaca ulang dari posisi nol. Ukuran byte yang dihasilkan mengikuti encoding: teks yang murni ASCII menempati satu byte per karakter, sedangkan karakter non-ASCII menempati lebih dari satu byte.

Contoh Menulis dan Membaca di Memori #

Contoh berikut menulis satu kalimat ke memori lewat StreamWriter, menyalin hasilnya menjadi byte[], lalu membacanya kembali lewat stream kedua:

csharp
byte[] salinan;
using (MemoryStream aliran = new MemoryStream())
{
    using StreamWriter penulis = new StreamWriter(aliran);
    penulis.Write("Laporan memori");
    penulis.Flush();
    salinan = aliran.ToArray();
}

Console.WriteLine($"Panjang data: {salinan.Length} byte");

using MemoryStream sumber = new MemoryStream(salinan);
using StreamReader pembaca = new StreamReader(sumber);
Console.WriteLine(pembaca.ReadToEnd());

Output yang Dihasilkan:

text
Panjang data: 14 byte
Laporan memori

Mari kita bedah baris demi baris:

  1. new MemoryStream(): membuat aliran kosong yang ukurannya tumbuh mengikuti tulisan; tidak ada berkas yang dibuat.
  2. new StreamWriter(aliran): menempatkan StreamWriter di atas aliran memori, membuktikan bahwa kode penulis tidak peduli stream-nya berisi apa.
  3. penulis.Flush(): memindahkan sisa buffer tulis ke MemoryStream sebelum ToArray dipanggil; teks 14 karakter menjadi 14 byte UTF-8.
  4. aliran.ToArray(): menyalin isi aliran menjadi byte[]; salinan ini tetap utuh meskipun kedua stream kemudian dibuang.
  5. new MemoryStream(salinan): membuka aliran baru di atas salinan itu; ReadToEnd membaca seluruh isinya mulai dari posisi 0.