Membuat Aplikasi TodoList (CRUD) dengan Java dan File
Ini adalah lanjutan dari tutorial sebelumnya:
Pada tutorial ini, kita akan belajar membuat aplikasi TodoList berbasis teks dengan memanfaatkan file sebagai media penyimpanan.
Langsung saja.
Mari kita mulai…
Membuat Class Baru
Buatlah class baru di dalam project AplikasiFile
dengan nama TodoListApp
.
Kemudian isi dengan kode berikut:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class TodoListApp {
// deklarasi variabel global
static String fileName;
static ArrayList<String> todoLists;
static boolean isEditing = false;
static Scanner input;
public static void main(String[] args) {
}
static void clearScreen(){
}
static void showMenu() {
}
static void backToMenu() {
}
static void readTodoList() {
}
static void showTodoList() {
}
static void addTodoList() {
}
static void editTodoList() {
}
static void deleteTodoList() {
}
}
Membuat Fungsi Clear Screen di Java
Fungsi ini kita butuhkan untuk membersihkan layar.
Silakan isi kode untuk fungsi clearScreen()
seperti berikut ini:
static void clearScreen() {
try {
final String os = System.getProperty("os.name");
if (os.contains("Windows")) {
// clear screen untuk windows
new ProcessBuilder("cmd", "/c", "cls")
.inheritIO()
.start()
.waitFor();
} else {
// clear screen untuk Linux, Unix, Mac
Runtime.getRuntime().exec("clear");
System.out.print("\033[H\033[2J");
System.out.flush();
}
} catch (final Exception e) {
System.out.println("Error karena: " + e.getMessage());
}
}
Kalau kita perhatikan, fungsi ini akan menjalankan
perintah cls
dan celar
.
Jika kamu membuka program ini dari Windows,
maka perintah cls
yang akan digunakan.
Dan clear
untuk Linux, Unix, dan Mac.
Tapi fungsi ini tidak bisa bekerja pada jendela output di Netbeans.
Membuat Fungsi showMenu()
Berikutnya kita membutuhkan fungsi showMenu()
untuk menampilkan menu apa saja yang ada di aplikasi.
Silakan isi kode untuk fungsi showMenu()
seperti berikut ini:
static void showMenu() {
System.out.println("=== TODO LIST APP ===");
System.out.println("[1] Lihat Todo List");
System.out.println("[2] Tambah Todo List");
System.out.println("[3] Edit Todo List");
System.out.println("[4] Hapus Todo List");
System.out.println("[0] Keluar");
System.out.println("---------------------");
System.out.print("Pilih menu> ");
String selectedMenu = input.nextLine();
if (selectedMenu.equals("1")) {
showTodoList();
} else if (selectedMenu.equals("2")) {
addTodoList();
} else if (selectedMenu.equals("3")) {
editTodoList();
} else if (selectedMenu.equals("4")) {
deleteTodoList();
} else if (selectedMenu.equals("0")) {
System.exit(0);
} else {
System.out.println("Kamu salah pilih menu!");
backToMenu();
}
}
Selain menampilkan menu, fungsi ini juga akan menentukan fungsi mana yang akan dieksekusi saat menu dipilih.
Misal, user memilih menu 1
, maka fungsi
showTodoList()
yang akan dieksekusi.
Membuat Fungsi backToMenu()
Fungsi ini kita butuhkan untuk kembali
ke Menu Utama. Silakan isi kode di
dalam fungsi backToMenu()
seperti ini:
static void backToMenu() {
System.out.println("");
System.out.print("Tekan [Enter] untuk kembali..");
input.nextLine();
clearScreen();
}
Fungsi ini akan meminta user untuk menekan Enter. Setelah itu akan membersihkan layar dan membuka menu Utama.
Walaupun kita tidak memanggil fungsi showMenu()
di sana, tapi tetap akan kembali ke menu.
Ini karena kita akan kembali ke main loop.
Apa itu main loop?
Nanti kita akan buat dan bahas..
Membuat Fungsi readTodoList()
Fungsi ini kita butuhkan untuk membaca isi File.
Silakan isi kode untuk fungsi readTodoList()
seperti berikut ini:
static void readTodoList() {
try {
File file = new File(fileName);
Scanner fileReader = new Scanner(file);
// load isi file ke dalam array todoLists
todoLists.clear();
while (fileReader.hasNextLine()) {
String data = fileReader.nextLine();
todoLists.add(data);
}
} catch (FileNotFoundException e) {
System.out.println("Error karena: " + e.getMessage());
}
}
Fungsi ini akan membaca file, lalu isinya akan
disimpan dalam variabel array todoLists
.
Fungsi ini akan kita panggil saat kita ingin membaca ulang isi file.
Membuat Fungsi showTodoList()
Fungsi ini kita butuhkan untuk menampilkan isi
dari file todolist.txt
.
Silakan isi kode fungsi showTodoList()
seperti berikut ini:
static void showTodoList() {
clearScreen();
readTodoList();
if (todoLists.size() > 0) {
System.out.println("TODO LIST:");
int index = 0;
for (String data : todoLists) {
System.out.println(String.format("[%d] %s", index, data));
index++;
}
} else {
System.out.println("Tidak ada data!");
}
if (!isEditing) {
backToMenu();
}
}
Fungsi ini hanya melakukan print atau cetak isi file.
Kita memanggil fungsi readTodoList()
di sini, untuk
membaca isi file.
Membuat Fungsi addTodoList()
Berikutnya, silakan isi kode untuk fungsi addTodoList()
seperti ini:
static void addTodoList() {
clearScreen();
System.out.println("Apa yang ingin kamu kerjakan?");
System.out.print("Jawab: ");
String newTodoList = input.nextLine();
try {
// tulis file
FileWriter fileWriter = new FileWriter(fileName, true);
fileWriter.append(String.format("%s%n", newTodoList));
fileWriter.close();
System.out.println("Berhasil ditambahkan!");
} catch (IOException e) {
System.out.println("Terjadi kesalahan karena: " + e.getMessage());
}
backToMenu();
}
Fungsi ini akan meminta user untuk menginputkan data todo list, kemudian menuliskannya ke dalam file.
Membuat Fungsi editTodoList()
Fungsi ini kita butuhkan untuk mengubah isi data.
Silakan isi kode untuk fungsi editTodoList()
seperti berikut ini:
static void editTodoList() {
isEditing = true;
showTodoList();
try {
System.out.println("-----------------");
System.out.print("Pilih Indeks> ");
int index = Integer.parseInt(input.nextLine());
if (index > todoLists.size()) {
throw new IndexOutOfBoundsException("Kamu memasukkan data yang salah!");
} else {
System.out.print("Data baru: ");
String newData = input.nextLine();
// update data
todoLists.set(index, newData);
System.out.println(todoLists.toString());
try {
FileWriter fileWriter = new FileWriter(fileName, false);
// write new data
for (String data : todoLists) {
fileWriter.append(String.format("%s%n", data));
}
fileWriter.close();
System.out.println("Berhasil diubah!");
} catch (IOException e) {
System.out.println("Terjadi kesalahan karena: " + e.getMessage());
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
isEditing = false;
backToMenu();
}
Cara kerja fungsi ini ada beberapa langkah:
- Meminta user untuk memilih nomer indeks dari data (indeks dalam array
todolist
) - Memeriksa indeks
- Meminta user untuk menginputkan data baru
- Menyimpan data baru ke dalam array
todolist
- Menulis ulang semua isi array
todolist
ke dalam file
Membuat Fungsi deleteTodoList()
Fungsi ini kita butuhkan untuk menghapus data todolist.
Silakan tulis kode untuk fungsi deleteTodoList()
seperti berikut ini.
static void deleteTodoList() {
isEditing = true;
showTodoList();
System.out.println("-----------------");
System.out.print("Pilih Indeks> ");
int index = Integer.parseInt(input.nextLine());
try {
if (index > todoLists.size()) {
throw new IndexOutOfBoundsException("Kamu memasukkan data yang salah!");
} else {
System.out.println("Kamu akan menghapus:");
System.out.println(String.format("[%d] %s", index, todoLists.get(index)));
System.out.println("Apa kamu yakin?");
System.out.print("Jawab (y/t): ");
String jawab = input.nextLine();
if (jawab.equalsIgnoreCase("y")) {
// hapus data
todoLists.remove(index);
// tulis ulang file
try {
FileWriter fileWriter = new FileWriter(fileName, false);
// write new data
for (String data : todoLists) {
fileWriter.append(String.format("%s%n", data));
}
fileWriter.close();
System.out.println("Berhasil dihapus!");
} catch (IOException e) {
System.out.println("Terjadi kesalahan karena: " + e.getMessage());
}
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
isEditing = false;
backToMenu();
}
Cara kerja fungsi deleteTodoList()
juga hampir sama dengan
editTodoList()
.
Membuat Inisialisasi dan Main Loop
Terakhir, kita harus membuat inisialisasi
dan main loop pada fungsi main()
.
Silakan tulis kode untuk fungsi main()
seperti berikut ini.
public static void main(String[] args) {
// initialize
todoLists = new ArrayList<>();
input = new Scanner(System.in);
String filePath = System.console() == null ? "/src/todolist.txt" : "/todolist.txt";
fileName = System.getProperty("user.dir") + filePath;
System.out.println("FILE: " + fileName);
// run the program (main loop)
while (true) {
showMenu();
}
}
Pertama kita harus melakukan inisialisasi atau mengisi
nilai pertama untuk tiap variabel global yang belum
memiliki isi agar tidak terjadi NullPointerException
.
Untuk menentukan lokasi file yang akan dibaca, kita menulisnya seperti ini:
String filePath = System.console() == null ? "/src/todolist.txt" : "/todolist.txt";
fileName = System.getProperty("user.dir") + filePath;
Karena nanti kita akan coba membuka aplikasi dari luar dan di dalam Netbeans.
Soalnya, alamat file (path) yang dibaca di Netbeans berbeda dengan yang di luar.
Terakhir, kita membuat main loop menjaga agar program tidak berhenti selama kita tidak menutupnya.
while (true) {
showMenu();
}
Fungsi showMenu()
akan dipanggil berulang-ulang
di dalam main loop.
Sekarang kode programnya sudah lengkap..
Kode Lengkap Program
|
|
..dan kita tinggal uji coba saja.
Uji Coba Program
Percobaan ini akan dilakukan di dua tempat, yakni Netbeans dan Terminal.
Percobaan dari Netbeans
- Melihat isi Todo List
- Tambah Todo List
- Edit Todo List
- Hapus Todo List
- Salah Pilih Menu dan Keluar
Seperti yang kita lihat, fungsi Clear Screen tidak akan bisa bekerja di Netbeans.
Sekarang mari kita coba jalankan melalui Terminal.
Percobaan dari Terminal
Klik kanan pada <default package>
kemudian, pilih Tools->Open in Terminal.
Setelah itu, compile programnya dengan perintah:
javac TodoListApp.java
Setelah itu, kita bisa buka programnya dengan perintah:
java TodoListApp
Mari kita coba semua fitur yang ada:
- Melihat isi Todo List
- Tambah Todo List
- Edit Todo List
- Hapus Todo List
- Salah Pilih Menu dan Keluar
Percobaan pada Terminal, berhasil! 🎉
Fungsi Clear Screen bisa bekerja di sini.
Akhir Kata..
Gimana?
Ada yang error?
Kalau tidak ada, syukurlah..
Tapi kalau ada error, kamu bisa tanyakan melalui kolom komentar.
Sekian tutorial ini. Semoga bermanfaat.
📖 untuk tutorial Java yang lainnya, silakan cek List Tutorial Java