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.

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.
Namespace System.IO menyediakan helper statis yang ringkas:
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.
Selalu periksa keberadaan file sebelum beroperasi:
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.
Untuk file besar, membaca semuanya sekaligus akan membebani memori. Gunakan stream yang membaca baris demi 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:
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.
Panduan memilih:
System.Text.Json adalah serializer bawaan yang cepat dan terintegrasi:
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.
Options disusun sekali lalu dipakai ulang:
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.
Proyek ASP.NET Core dan worker otomatis memuat appsettings.json melalui host. Contoh file:
{
"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 menimpa appsettings.json saat key bertemu. Aturan penamaan: bagian dipisahkan __ (dua underscore). Jadi ConnectionStrings__Default memetakan ke ConnectionStrings:Default. Cek nilainya di kode:
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.
Ringkasan aturan praktik:
Inti yang harus dibawa pulang:
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.