import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class TulisTeks {
    public static void main(String[] args) throws IOException {
        // FileWriter dengan charset eksplisit.
        try (FileWriter penulis = new FileWriter("surat.txt", StandardCharsets.UTF_8)) {
            penulis.write("Halo Budi,\n");
            penulis.write("sampai jumpa di kelas berikutnya.\n");
        }

        // Jembatan: OutputStreamWriter membungkus FileOutputStream.
        try (OutputStreamWriter penulis = new OutputStreamWriter(
                new FileOutputStream("surat.txt", true), StandardCharsets.UTF_8)) {
            penulis.write("— Siti\n");
        }

        // PrintWriter di atas jembatan yang sama.
        try (PrintWriter penulis = new PrintWriter(new OutputStreamWriter(
                new FileOutputStream("surat.txt", true), StandardCharsets.UTF_8))) {
            penulis.println("Baris dari PrintWriter.");
            penulis.printf("Total %d baris selesai.%n", 5);
        }

        // Baca balik lewat jembatan pembaca.
        try (InputStreamReader pembaca = new InputStreamReader(
                new FileInputStream("surat.txt"), StandardCharsets.UTF_8)) {
            List<String> baris = new BufferedReader(pembaca).lines().toList();
            System.out.println("jumlah baris   : " + baris.size());
            System.out.println("tanda tangan   : " + baris.get(2));
            System.out.println("baris terakhir : " + baris.get(baris.size() - 1));
        }
    }
}
