Masukkan Password
50 Exercise Solution Chapter 5 | File Handling Exercise Solution in Dart | Learn Dart | Dart Course
Pada bagian ini instruktur benar-benar mempraktikkan 7 soal latihan Chapter 5 yang sebelumnya hanya diberikan sebagai tugas.
Ada beberapa kesalahan transkripsi dari caption yang perlu dibetulkan:
- DOT programming language → Dart programming language
- iio / IO package →
dart:io - write as string sync →
writeAsStringSync() - file mode append →
FileMode.append - directory.crun →
Directory.current - copy sync →
copySync() - delete sync →
deleteSync() - back sln →
\n(newline) - dxt →
.txt - far Loop →
for loop
Yang menarik, dari praktik ini kita bisa melihat bagaimana semua method File Handling digunakan dalam program nyata.
1. Soal pertama — Menulis nama ke hello.txt
Instruktur mulai dengan:
import 'dart:io';
Kenapa dart:io?
Karena kita ingin berinteraksi dengan sistem operasi, khususnya file.
Library dart:io menyediakan berbagai hal seperti:
File
Directory
readAsStringSync()
writeAsStringSync()
deleteSync()
copySync()
Jadi hampir semua latihan di chapter ini membutuhkan:
import 'dart:io';
Membuat objek File
Instruktur kemudian membuat:
File file = File('C:/Users/username/Downloads/hello.txt');
Misalnya komputer kita adalah Windows dan username-nya Budi:
File file = File(
'C:/Users/Budi/Downloads/hello.txt',
);
Ini berarti:
Saya ingin bekerja dengan file
hello.txtyang berada di folder Downloads.
Perlu diperhatikan
File(...)
tidak selalu langsung membuat file secara fisik.
Kita baru melakukan operasi terhadap file tersebut ketika menjalankan method seperti:
file.writeAsStringSync(...)
2. Menulis nama ke file
Kemudian:
file.writeAsStringSync('Budi');
Artinya:
Tuliskan
"Budi"ke dalam file.
Kalau hello.txt belum ada, operasi write dapat membuat file tersebut.
Setelah program dijalankan:
Downloads
│
└── hello.txt
Isi:
Budi
Bagaimana cara kerja writeAsStringSync()?
Bayangkan:
Program Dart
│
│ "Budi"
↓
hello.txt
Jadi:
writeAsStringSync()
↓
Program → File
Ini adalah write operation.
3. Kenapa menggunakan absolute path?
Instruktur menggunakan path seperti:
C:/Users/Budi/Downloads/hello.txt
Ini disebut absolute path.
Karena lokasi file ditulis lengkap dari drive sampai nama file.
Contoh:
C:
└── Users
└── Budi
└── Downloads
└── hello.txt
Berbeda dengan:
File('hello.txt');
yang merupakan relative path.
Relative path bergantung pada current working directory.
Absolute vs Relative Path
| Jenis | Contoh | Keterangan |
|---|---|---|
| Relative | hello.txt | relatif terhadap working directory |
| Absolute | C:/Users/Budi/Downloads/hello.txt | lokasi lengkap |
Untuk latihan awal, keduanya boleh digunakan.
4. Soal kedua — Append nama teman
Setelah hello.txt berisi:
Budi
instruktur ingin menambahkan nama teman, misalnya:
Ali
Target akhirnya:
Budi
Ali
Kalau menggunakan:
file.writeAsStringSync('Ali');
maka Budi akan tertimpa.
Hasilnya hanya:
Ali
Karena default writeAsStringSync() adalah overwrite.
5. Menggunakan FileMode.append
Supaya data lama tetap ada:
file.writeAsStringSync(
'\nAli',
mode: FileMode.append,
);
Ada dua hal penting di sini.
Pertama:
mode: FileMode.append
Artinya:
Jangan hapus data lama. Tambahkan data baru di akhir file.
Kedua:
'\nAli'
\n berarti baris baru.
Jadi:
Budi
Ali
bukan:
BudiAli
6. Perbedaan overwrite dan append
Ini wajib dipahami.
Overwrite
file.writeAsStringSync('Ali');
Sebelumnya:
Budi
Sesudahnya:
Ali
Append
file.writeAsStringSync(
'\nAli',
mode: FileMode.append,
);
Sebelumnya:
Budi
Sesudahnya:
Budi
Ali
Jadi:
writeAsStringSync()
↓
overwrite
↓
data lama diganti
FileMode.append
↓
append
↓
data baru ditambahkan
7. Soal ketiga — Current Working Directory
Instruktur kemudian menggunakan:
print(Directory.current);
Ini digunakan untuk mengetahui:
Program Dart saat ini sedang bekerja dari folder mana?
Contoh output:
C:\Users\Budi\Documents\dart_project
Artinya current working directory program adalah:
dart_project
Kenapa ini penting?
Misalnya kita menulis:
File file = File('hello.txt');
Kita tidak memberikan lokasi lengkap.
Dart harus tahu:
“Hello.txt ini dicari di mana?”
Jawabannya biasanya berdasarkan current working directory.
Maka:
print(Directory.current);
sangat berguna ketika kita bingung:
“File yang dibuat program kok tidak ada di folder yang saya lihat?”
8. Soal keempat — Copy file
Sekarang kita mempunyai:
hello.txt
Instruktur ingin membuat:
hello_copy.txt
Caranya:
file.copySync(
'C:/Users/Budi/Downloads/hello_copy.txt',
);
Artinya:
Salin file yang direpresentasikan oleh
fileke lokasi baru.
Gambaran sederhananya
hello.txt
│
│ copySync()
↓
hello_copy.txt
Setelah proses:
Downloads
├── hello.txt
└── hello_copy.txt
Kedua file mempunyai isi yang sama.
9. copySync() vs renameSync()
Jangan sampai tertukar.
Copy
file.copySync('hello_copy.txt');
Hasil:
hello.txt
hello_copy.txt
File asli tetap ada.
Rename
file.renameSync('hello_new.txt');
File berubah nama:
hello_new.txt
File dengan nama lama tidak lagi menjadi file yang sama.
Jadi:
copy → membuat salinan
rename → mengganti nama/memindahkan
10. Soal kelima — Membuat 100 file dengan for
Ini salah satu latihan paling bagus karena menggabungkan:
FilecreateSync()for loop- String interpolation
Instruktur menggunakan pola:
for (int i = 1; i <= 100; i++) {
...
}
Artinya loop berjalan:
i = 1
i = 2
i = 3
...
i = 100
11. Membuat nama file secara otomatis
Bagian yang menarik adalah:
File file = File(
'C:/Users/Budi/Downloads/file$i.txt',
);
$i adalah string interpolation.
Ketika:
i = 1
maka:
file$i.txt
menjadi:
file1.txt
Ketika:
i = 2
menjadi:
file2.txt
Dan seterusnya.
Kemudian file dibuat
Misalnya:
file.writeAsStringSync('Hello');
Maka setiap iterasi membuat file baru.
Hasilnya:
file1.txt
file2.txt
file3.txt
file4.txt
...
file100.txt
12. Ada sedikit hal yang perlu diperhatikan dari kode instruktur
Di caption dikatakan:
i = 0
i <= 100
Kalau benar-benar:
for (int i = 0; i <= 100; i++) {
maka yang dibuat sebenarnya:
file0.txt
file1.txt
file2.txt
...
file100.txt
Itu berarti 101 file, bukan 100.
Kalau kita ingin tepat 100 file, lebih mudah menggunakan:
for (int i = 1; i <= 100; i++) {
sehingga:
file1.txt
...
file100.txt
Jumlahnya tepat 100.
Ini contoh penting bahwa kita harus memperhatikan nilai awal, kondisi, dan increment dalam loop.
13. Soal keenam — Menghapus hello_copy.txt
Sekarang instruktur ingin menghapus:
hello_copy.txt
Caranya:
file.deleteSync();
Misalnya:
import 'dart:io';
void main() {
File file = File(
'C:/Users/Budi/Downloads/hello_copy.txt',
);
file.deleteSync();
print('File deleted.');
}
Setelah dijalankan:
Sebelum:
Downloads
├── hello.txt
└── hello_copy.txt
Sesudah:
Downloads
└── hello.txt
14. Lebih aman menggunakan existsSync()
Kalau file tidak ada, deleteSync() dapat menghasilkan exception.
Karena itu lebih aman:
if (file.existsSync()) {
file.deleteSync();
print('File berhasil dihapus.');
} else {
print('File tidak ditemukan.');
}
Logikanya:
Apakah hello_copy.txt ada?
│
┌───┴───┐
YA TIDAK
│ │
delete tampilkan
file "tidak ada"
Ini adalah pola yang bagus untuk program nyata.
15. Soal ketujuh — CSV
Ini bagian yang paling banyak konsepnya.
Instruktur ingin:
Store name, age and address of students in a CSV file and read it.
Artinya kita akan membuat file:
students.csv
dan menyimpan data:
name,age,address
Budi,20,Madiun
Ali,21,Surabaya
Citra,19,Malang
16. Apa itu CSV?
CSV = Comma-Separated Values.
Artinya data biasanya dipisahkan dengan koma:
Budi,20,Madiun
Bisa kita anggap sebagai:
Nama Umur Alamat
↓ ↓ ↓
Budi 20 Madiun
Baris pertama biasanya digunakan sebagai header:
name,age,address
Kemudian data:
Budi,20,Madiun
17. Membuat CSV
Instruktur menggunakan:
file.writeAsStringSync(
'name,age,address\n'
'Budi,20,Madiun',
);
Hasil file:
name,age,address
Budi,20,Madiun
Perhatikan:
\n
berarti pindah baris.
Jadi:
'name,age,address\n'
'Budi,20,Madiun'
menghasilkan:
name,age,address
Budi,20,Madiun
18. Menggunakan loop untuk membuat 100 record
Instruktur kemudian menggunakan for untuk memasukkan banyak data.
Misalnya:
for (int i = 1; i <= 100; i++) {
file.writeAsStringSync(
'\nName $i,Age $i,Address $i',
mode: FileMode.append,
);
}
Hasilnya kira-kira:
name,age,address
Name 1,Age 1,Address 1
Name 2,Age 2,Address 2
Name 3,Age 3,Address 3
...
Name 100,Age 100,Address 100
19. Kenapa harus menggunakan FileMode.append?
Ini sangat penting.
Misalnya kita punya:
name,age,address
Kemudian loop berjalan.
Kalau kita melakukan:
file.writeAsStringSync(...)
tanpa append, setiap iterasi akan menimpa isi sebelumnya.
Akibatnya kita tidak mendapatkan 100 record.
Dengan:
mode: FileMode.append
setiap record ditambahkan ke bagian akhir.
Jadi:
Record 1
↓
append
↓
Record 2
↓
append
↓
Record 3
↓
append
↓
...
20. writeAsStringSync() tidak memahami CSV
Ini konsep yang cukup penting.
Ketika kita menulis:
file.writeAsStringSync(
'Budi,20,Madiun',
);
Dart sebenarnya hanya melihatnya sebagai:
String
Dart tidak otomatis mengatakan:
“Oh, ini data CSV.”
CSV pada dasarnya adalah format teks.
Kita yang membuat strukturnya dengan:
,
untuk memisahkan kolom dan:
\n
untuk memisahkan baris.
21. Membaca CSV
Setelah data disimpan, instruktur menghapus loop dan menggunakan:
print(file.readAsStringSync());
Ini berarti:
students.csv
↓
readAsStringSync()
↓
String
↓
print()
Misalnya isi file:
name,age,address
Budi,20,Madiun
Ali,21,Surabaya
maka output:
name,age,address
Budi,20,Madiun
Ali,21,Surabaya
22. Perbedaan read dan write
Ini adalah salah satu konsep terpenting dari chapter ini.
Write
file.writeAsStringSync(...)
Arah:
PROGRAM
↓
FILE
Read
file.readAsStringSync()
Arah:
FILE
↓
PROGRAM
Jadi gampangnya:
Write = memasukkan data ke file.
Read = mengambil data dari file.
23. Kalau ingin membaca CSV sebagai data terpisah
Misalnya:
Budi,20,Madiun
readAsStringSync() akan menghasilkan String:
String data = file.readAsStringSync();
Kalau ingin memisahkan baris:
List<String> lines = data.split('\n');
Kemudian setiap baris dapat dipisahkan menggunakan:
line.split(',');
Misalnya:
String line = 'Budi,20,Madiun';
List<String> student = line.split(',');
print(student[0]); // Budi
print(student[1]); // 20
print(student[2]); // Madiun
Jadi:
"Budi,20,Madiun"
↓
split(',')
↓
[Budi, 20, Madiun]
Ini menghubungkan materi String + List + File Handling yang sudah kita pelajari sebelumnya.
24. Versi program yang lebih rapi untuk latihan
Kalau kita gabungkan konsep CSV tadi:
import 'dart:io';
void main() {
File file = File('students.csv');
// Membuat header
file.writeAsStringSync(
'name,age,address\n',
);
// Menambahkan 100 data
for (int i = 1; i <= 100; i++) {
file.writeAsStringSync(
'Student $i,$i,Address $i\n',
mode: FileMode.append,
);
}
// Membaca file
String data = file.readAsStringSync();
print(data);
}
Alurnya:
Buat students.csv
↓
Tulis header
↓
Loop 1-100
↓
Append setiap record
↓
File selesai
↓
Read file
↓
Print data
25. Ada satu perbedaan penting antara contoh instruktur dan praktik yang baik
Instruktur menggunakan:
File(...)
dengan absolute path seperti:
C:/Users/Budi/Downloads/...
Ini boleh untuk demonstrasi.
Tetapi kalau program dibagikan ke orang lain, path seperti itu bermasalah.
Misalnya komputer saya:
C:/Users/Budi/Downloads
sedangkan komputer teman:
C:/Users/Ali/Downloads
Program saya tidak otomatis bekerja di komputer Ali.
Karena itu untuk latihan sederhana kita bisa menggunakan:
File('hello.txt');
atau menggunakan path yang dibangun secara lebih fleksibel untuk aplikasi yang lebih serius.
26. Ringkasan Chapter 5 dari semua praktik ini
Sekarang kita bisa melihat semua method yang sudah dipelajari:
| Kebutuhan | Dart |
|---|---|
| Menentukan file | File('hello.txt') |
| Membuat file | createSync() |
| Menulis | writeAsStringSync() |
| Append | FileMode.append |
| Membaca | readAsStringSync() |
| Mengecek file | existsSync() |
| Menghapus | deleteSync() |
| Copy | copySync() |
| Rename | renameSync() |
| Current directory | Directory.current |
27. Cara mengingatnya dengan analogi sederhana
Bayangkan file adalah sebuah buku.
File()
Kita menunjuk buku yang ingin kita gunakan:
File('hello.txt')
“Saya mau bekerja dengan buku ini.”
writeAsStringSync()
Menulis isi baru:
“Tulis ini ke buku.”
FileMode.append
Membuka halaman terakhir lalu menambahkan tulisan:
“Jangan hapus tulisan lama.”
readAsStringSync()
Membaca isi buku:
“Apa isi buku ini?”
copySync()
Memfotokopi buku:
“Buat salinannya.”
deleteSync()
Membuang buku:
“Hapus buku ini.”
existsSync()
Mengecek:
“Apakah buku ini ada?”
Directory.current
Mengecek:
“Sekarang saya berada di ruangan/folder mana?”
28. Pola berpikir yang perlu kamu kuasai
Daripada menghafal 10 method, coba tanyakan:
“Saya ingin melakukan apa terhadap file?”
FILE
│
┌─────────┼─────────┐
↓ ↓ ↓
BACA TULIS HAPUS
│ │ │
read write delete
Kalau ingin menambahkan:
TULIS
↓
Apakah data lama harus tetap ada?
↓
YES
↓
FileMode.append
Kalau ingin membuat salinan:
COPY
↓
copySync()
Kalau ingin tahu lokasi kerja program:
DIRECTORY
↓
Directory.current
Kalau ingin melakukan sesuatu berulang kali:
REPEAT
↓
for loop
🎯 Inti latihan Chapter 5
Sebenarnya ketujuh soal ini sedang mengajarkan satu alur besar:
FILE HANDLING
│
┌──────────────┼──────────────┐
↓ ↓ ↓
CREATE READ WRITE
│ │ │
│ │ ┌──────┴──────┐
│ │ ↓ ↓
│ │ OVERWRITE APPEND
│ │ │ │
↓ ↓ ↓ ↓
createSync() readAsStringSync() writeAsStringSync()
FileMode.append
┌──────────────┬──────────────┐
↓ ↓ ↓
COPY DELETE DIRECTORY
↓ ↓ ↓
copySync() deleteSync() Directory.current
Dan soal CSV menggabungkan semuanya:
Data siswa
↓
String
↓
CSV
↓
writeAsStringSync()
↓
students.csv
↓
readAsStringSync()
↓
Data dibaca kembali
Jadi setelah menyelesaikan Chapter 5, kamu sudah punya dasar untuk membuat program Dart yang bisa berinteraksi langsung dengan file di komputer: membuat, membaca, menulis, menambahkan, menyalin, dan menghapus file.