Method File.ReadAllText nyaman dipakai, tetapi seluruh isi berkas harus berada di memori terlebih dahulu. Ketika berkas berukuran gigabyte atau data mengalir dari sumber lain seperti jaringan, kita membutuhkan abstraksi yang lebih umum: stream. Stream adalah aliran byte yang bisa dibaca atau ditulis sepotong demi sepotong, dan abstraksi inilah fondasi seluruh operasi I/O di .NET.
Hierarki Stream di System IO #
Class abstrak System.IO.Stream mendefinisikan kontrak baca-tulis byte melalui method seperti Read, Write, dan Seek. Turunannya spesifik menurut sumber data, sedangkan StreamReader dan StreamWriter menyambung di atas stream untuk menerjemahkan byte menjadi karakter melalui encoding tertentu, dengan UTF-8 sebagai pilihan bawaan:
| Class | Peran |
|---|---|
FileStream | Stream untuk berkas di disk |
MemoryStream | Stream yang tersimpan di memori |
NetworkStream | Stream untuk koneksi jaringan |
StreamReader | Pembungkus stream menjadi baris teks |
Membaca Baris dengan StreamReader #
Contoh berikut membaca berkas tiga baris satu per satu, tanpa memuat seluruh isi menjadi array:
string dir = Path.Combine(Path.GetTempPath(), "verify-6c", "stream-dan-streamreader");
Directory.CreateDirectory(dir);
string path = Path.Combine(dir, "menu-kedai.txt");
File.WriteAllText(path, "Kopi Gayo\nKopi Toraja\nTeh Melati");
using StreamReader pembaca = new StreamReader(path);
string? baris;
int nomor = 1;
while ((baris = pembaca.ReadLine()) != null)
{
Console.WriteLine($"{nomor}. {baris}");
nomor++;
}
Console.WriteLine($"EndOfStream: {pembaca.EndOfStream}");Output yang Dihasilkan:
1. Kopi Gayo
2. Kopi Toraja
3. Teh Melati
EndOfStream: TrueMari kita bedah baris demi baris:
new StreamReader(path): membukaFileStreamdi balik layar dan menyiapkan buffer pembacaan UTF-8.pembaca.ReadLine(): mengembalikan satu baris tanpa karakter pemisahnya, ataunullketika akhir aliran tercapai; polawhilemenghentikan perulangan tepat di situ.string? baris: variabel bertipe nullable karena hasilReadLinebisanull; pengujian!= nullmemastikan isi hanya dipakai saat masih valid.pembaca.EndOfStream: bernilaiTruesetelah byte terakhir terbaca, menandakan seluruh aliran sudah habis.using StreamReader: menutup stream saat blok berakhir; stream yang tidak pernah ditutup membuat berkas tetap dikunci di beberapa sistem operasi.