Membuat Aplikasi TodoList (CRUD) dengan Java dan File

Ini adalah lanjutan dari tutorial sebelumnya:

Pada tutorial ini, kita akan belajar membuat alikasi 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.

Membuat Class 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. Silahkan 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.

Silahkan 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. Silahkan 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. Silahkan 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.

Silahkan 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, silahakan 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. Silahkan 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 memasukan 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:

  1. Meminta user untuk memilih nomer indeks dari data (indeks dalam array todolist)
  2. Memeriksa indeks
  3. Meminta user untuk menginputkan data baru
  4. Menyimpan data baru ke dalam array todolist
  5. Menulis ulang semua isi array todolist ke dalam file

Membuat Fungsi deleteTodoList()

Fungsi ini kita butuhkan untuk menghapus data todolist. Silahkan 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 memasukan 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().

Silahkan 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 inisalisasi 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;

Kaerna nanti kita akan coba membuka palikasi dari luar dan di dalam Netbeans.

Soalnya, alamat file (path) yang dibaca di Netbeans berbeda dengan yang di lauar.

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
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class TodoListApp {

    static String fileName;
    static ArrayList<String> todoLists;
    static boolean isEditing = false;
    static Scanner input;

    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
        while (true) {
            showMenu();
        }
    }

    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());
        }

    }

    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();
        }
    }

    static void backToMenu() {
        System.out.println("");
        System.out.print("Tekan [Enter] untuk kembali..");
        input.nextLine();
        clearScreen();
    }

    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());
        }
    }

    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();
        }
    }

    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();
    }

    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 memasukan 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();
    }

    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 memasukan 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")) {
                    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();
    }

}

..dan kita tinggal uji coba saja.

Uji Coba Program

Percobaan ini akan dilakukan di dua tempat, yakni Netbeans dan Terminal.

Percobaan dari Netbeans

  1. Melihat isi Todo List

Demo Program: Melihat daftar todo list

  1. Tambah Todo List

Demo Program: Membuat Todo List Baru

  1. Edit Todo List

Demo Program: Edit Todo List

  1. Hapus Todo List

Demo Program: Hapus Tudo List

  1. Salah Pilih Menu dan Keluar

Demo Program: Keluar dari program

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.

Membuka Terminal dari Netbeans

Setelah itu, compile programnya dengan perintah:

javac TodoListApp.java

Compile Program Melalui Terminal dari Netbeans

Setelah itu, kita bisa buka programnya dengan perintah:

java TodoListApp

Mari kita coba semua fitur yang ada:

  1. Melihat isi Todo List

Demo Program: Melihat daftar todo list

  1. Tambah Todo List

Demo Program: Membuat Todo List Baru

  1. Edit Todo List

Demo Program: Edit Todo List

  1. Hapus Todo List

Demo Program: Hapus Tudo List

  1. Salah Pilih Menu dan Keluar

Demo Program: Keluar dari program

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, silahkan cek List Tutorial Java