Class File berperilaku seperti pintu cepat: satu panggilan untuk membaca atau menulis seluruh isi. Di balik pintu itu, .NET sebenarnya membuat FileStream. Class inilah yang mengendalikan detail tingkat rendah: berkas mana yang dibuka, untuk dibaca atau ditulis, mulai dari posisi mana, dan buffer sebesar apa. Membuat FileStream secara manual diperlukan ketika kita menginginkan kontrol penuh, misalnya menulis sebagian byte pada posisi tertentu.
FileMode dan FileAccess #
Dua enum menentukan perilaku pembukaan. FileMode menyatakan apa yang dilakukan sistem operasi terhadap berkas, sedangkan FileAccess menyatakan izinnya: Read, Write, atau ReadWrite:
| FileMode | Bila berkas sudah ada | Bila berkas tidak ada |
|---|---|---|
Create | ditimpa dari awal | dibuat baru |
Open | dibuka | FileNotFoundException dilempar |
OpenOrCreate | dibuka | dibuat baru |
Contoh Menulis dan Membaca Byte #
Contoh berikut membuka berkas dua kali: pertama untuk menulis empat byte, kedua untuk membacanya ke buffer:
string dir = Path.Combine(Path.GetTempPath(), "verify-6c", "filestream");
Directory.CreateDirectory(dir);
string path = Path.Combine(dir, "blok.bin");
using (FileStream aliran = new FileStream(path, FileMode.Create, FileAccess.Write))
{
byte[] data = { 0x10, 0x20, 0x30, 0x40 };
aliran.Write(data, 0, data.Length);
Console.WriteLine($"Posisi setelah menulis: {aliran.Position}");
}
using FileStream pembaca = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[8];
int terbaca = pembaca.Read(buffer, 0, buffer.Length);
Console.WriteLine($"Terbaca: {terbaca} byte");
Console.WriteLine(BitConverter.ToString(buffer, 0, terbaca));Output yang Dihasilkan:
Posisi setelah menulis: 4
Terbaca: 4 byte
10-20-30-40Mari kita bedah baris demi baris:
FileMode.CreatedanFileAccess.Write: membuka berkas khusus untuk menulis; berkas lama, bila ada, ditimpa dari byte nol.aliran.Write(data, 0, data.Length): menulis seluruh array mulai dari offset 0 array; argumen offset dan jumlah inilah kontrol tambahan yang tidak dimilikiFile.WriteAllBytes.aliran.Position: kursor berpindah dari 0 ke 4, menunjuk byte berikutnya yang akan ditulis.pembaca.Read(buffer, 0, buffer.Length): mengisi buffer dari posisi sekarang dan mengembalikan jumlah byte yang benar-benar terbaca, yaitu 4.BitConverter.ToString(buffer, 0, terbaca): hanya memformat 4 byte pertama; dua byte terakhir buffer tetap bernilai 0 karena tidak pernah diisi.