Belajar .NET - I/O & File Handling
Episode 7 of 23

Belajar .NET - I/O & File Handling

Episode ini membedah pengelolaan file dan data di .NET: API System.IO untuk membaca menulis file, StreamReader, StreamWriter, dan FileStream untuk data besar, serialisasi JSON dengan System.Text.Json, serta pembacaan appsettings.json dan environment variable.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Hampir semua aplikasi menyentuh file: membaca konfigurasi, menulis log, atau memproses data impor. Episode 7 membedah I/O dan file handling di .NET — mulai dari API sederhana System.IO, stream untuk data besar, serialisasi JSON, hingga integrasi dengan sistem konfigurasi.

Perbedaan kunci yang akan kalian pelajari: API sekali-jalan seperti File.ReadAllText nyaman untuk file kecil, sedangkan stream wajib dipakai saat menangani file besar agar memori tidak jebol. Dan untuk pertukaran data modern, JSON adalah format utamanya.

System.IO dan API File dan Directory

Membaca dan Menulis File

Namespace System.IO menyediakan helper statis yang ringkas:

Membaca dan menulis file
var path = Path.Combine("data", "catatan.txt");
Directory.CreateDirectory(Path.GetDirectoryName(path));
 
File.WriteAllText(path, "Hello dari file");
string isi = File.ReadAllText(path);
 
Console.WriteLine(isi);

File.WriteAllText dan File.ReadAllText menangani seluruh siklus file dalam satu panggilan. Path.Combine menyusun jalur lintas platform dengan benar — hindari menggabungkan jalur manual dengan slash, karena akan pecah di Windows.

Memeriksa dan Menghapus File

Selalu periksa keberadaan file sebelum beroperasi:

Memeriksa dan menghapus
if (File.Exists(path))
{
    File.Delete(path);
}
 
if (Directory.Exists("data"))
{
    Console.WriteLine("Folder data ada");
}

File.Exists(path) dan Directory.Exists mengembalikan boolean yang aman dipakai sebagai penjaga sebelum operasi I/O. Gabungkan dengan blok try/catch dari episode 6 untuk menangani akses yang ditolak atau file yang terkunci.

StreamReader, StreamWriter, dan FileStream

Membaca File Besar dengan Stream

Untuk file besar, membaca semuanya sekaligus akan membebani memori. Gunakan stream yang membaca baris demi baris:

StreamReader baris per baris
using var reader = new StreamReader("log.txt");
 
while (await reader.ReadLineAsync() is string baris)
{
    Console.WriteLine(baris);
}

StreamReader.ReadLineAsync membaca satu baris pada satu waktu — memori tetap kecil meski file jutaan baris. Menulis dengan StreamWriter serupa:

StreamWriter menulis baris
await using var writer = new StreamWriter("out.txt");
await writer.WriteLineAsync("baris pertama");

await using var writer menggabungkan dispose otomatis dengan pemrosesan asinkron. FileStream memberi kontrol terendah — posisi pointer, buffering, dan mode akses — cocok untuk format biner dan kustom.

Kapan Memakai Stream

Panduan memilih:

  • File.ReadAllText: file kecil yang dibaca penuh.
  • StreamReader/StreamWriter: file besar yang diproses baris demi baris.
  • FileStream: akses biner, seek, dan kontrol buffer penuh.
  • MemoryStream: data dalam memori yang ingin diperlakukan seperti stream.

Serialisasi JSON dengan System.Text.Json

Serialize dan Deserialize

System.Text.Json adalah serializer bawaan yang cepat dan terintegrasi:

Serialisasi JSON
public record User(string Nama, int Umur);
 
var user = new User("Arman", 30);
string json = JsonSerializer.Serialize(user);
User balik = JsonSerializer.Deserialize<User>(json);
 
Console.WriteLine(balik.Nama);

JsonSerializer.Serialize(user) mengubah object menjadi JSON, dan Deserialize<User> mengembalikannya. Perilaku default memakai property name polos — kalian bisa menyesuaikan lewat JsonSerializerOptions, misalnya PropertyNamingPolicy = JsonNamingPolicy.CamelCase untuk konsistensi dengan API web.

Mengonfigurasi Options

Options disusun sekali lalu dipakai ulang:

Options serializer
var options = new JsonSerializerOptions
{
    WriteIndented = true,
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
 
string cantik = JsonSerializer.Serialize(user, options);

WriteIndented = true menghasilkan JSON dengan indentasi yang mudah dibaca manusia. Untuk performa tertinggi, hindari membuat options baru setiap panggilan — simpan sebagai static.

Configuration File dan Environment Variable

Membaca appsettings.json

Proyek ASP.NET Core dan worker otomatis memuat appsettings.json melalui host. Contoh file:

appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  },
  "ConnectionStrings": {
    "Default": "Server=localhost;Database=App"
  }
}

Konfigurasi dibaca via IConfiguration yang disuntikkan ke aplikasi. Nilai sensitive seperti koneksi database sebaiknya diletakkan di environment variable agar tidak ter-commit ke Git.

Environment Variable dan Provider Order

Environment variable menimpa appsettings.json saat key bertemu. Aturan penamaan: bagian dipisahkan __ (dua underscore). Jadi ConnectionStrings__Default memetakan ke ConnectionStrings:Default. Cek nilainya di kode:

Membaca konfigurasi
var koneksi = builder.Configuration.GetConnectionString("Default");
Console.WriteLine(koneksi);

builder.Configuration.GetConnectionString("Default") mengambil nilai dari provider yang sesuai. Urutan provider — file JSON, lalu env vars, lalu command line — menentukan siapa yang berhak menimpa. Detailnya akan kita dalami di episode 10.

Tip

Jangan hardcode jalur file atau string koneksi. Baca dari konfigurasi, dan biarkan environment variable menimpa nilainya saat deployment.

Panduan I/O yang Sehat

Ringkasan aturan praktik:

  • Pakai Path.Combine dan Path.GetFileName agar lintas platform aman.
  • Pilih stream untuk file besar; helper satu panggilan untuk file kecil.
  • Periksa File.Exists sebelum operasi yang berisiko.
  • Serialisasi JSON dengan options yang disimpan sebagai static.
  • Simpan rahasia di environment variable, bukan di file yang di-commit.

Penutup

Inti yang harus dibawa pulang:

  • System.IO menyediakan helper membaca dan menulis file secara ringkas.
  • StreamReader dan StreamWriter cocok untuk file besar dengan memori kecil.
  • FileStream memberikan kontrol penuh untuk data biner dan seek.
  • System.Text.Json menangani serialisasi dan deserialisasi dengan cepat.
  • appsettings.json dimuat otomatis; env var menimpanya dengan prefix __.
  • Konfigurasi diakses lewat IConfiguration dan GetConnectionString.

Di episode 8 selanjutnya kita akan membahas dependency injection dan service lifetimes — container Microsoft.Extensions.DependencyInjection, lifetimes scoped, transient, dan singleton, service registration patterns, serta pengaturan layanan di dalam Generic Host.

Belajar .NET - I/O & File Handling | Belajar .NET