Saat aplikasi perlu menyimpan data antara (misalnya cache hasil download, log sementara, atau file upload yang sedang diproses), temporary file adalah pilihan yang tepat. OS menyediakan direktori khusus (/tmp di Linux, %TEMP% di Windows) yang otomatis dibersihkan secara berkala. Kotlin mewarisi API java.nio.file.Files untuk membuat file sementara secara aman dengan nama unik.

Membuat File dan Direktori Sementara #

Dua API utama adalah Files.createTempFile() untuk file dan Files.createTempDirectory() untuk direktori. Kedua fungsi ini menjamin nama unik dengan menambahkan angka acak ke prefix yang kita berikan.

kotlin
import java.nio.file.Files
import java.nio.file.Path

fun main() {
    // createTempFile: file sementara dengan prefix dan suffix
    val tmpFile = Files.createTempFile("notepad-", ".txt")
    Files.write(tmpFile, "data sementara".toByteArray())
    println("File sementara: $tmpFile")
    println("Isi: ${Files.readString(tmpFile)}")
    println("Ukuran: ${Files.size(tmpFile)} bytes")

    // createTempDirectory: direktori sementara
    val tmpDir = Files.createTempDirectory("work-")
    println("\nDirektori sementara: $tmpDir")

    // Tulis beberapa file di dalam direktori sementara
    val sub1 = tmpDir.resolve("a.txt")
    val sub2 = tmpDir.resolve("b.txt")
    Files.write(sub1, "isi A".toByteArray())
    Files.write(sub2, "isi B".toByteArray())
    println("Isi direktori:")
    Files.list(tmpDir).forEach { println("  - ${it.fileName}") }

    // File.deleteOnExit: hapus otomatis saat JVM keluar
    val autoDeleted = Files.createTempFile("auto-", ".tmp")
    autoDeleted.toFile().deleteOnExit()
    println("\nFile deleteOnExit: $autoDeleted (akan dihapus saat JVM keluar)")

    // Cleanup eksplisit (praktik terbaik)
    Files.deleteIfExists(tmpFile)
    Files.deleteIfExists(sub1)
    Files.deleteIfExists(sub2)
    Files.deleteIfExists(tmpDir)
    println("Cleanup eksplisit selesai")
}

Output yang Dihasilkan:

text
File sementara: /tmp/notepad-13482787565895542365.txt
Isi: data sementara
Ukuran: 14 bytes

Direktori sementara: /tmp/work-4861406713560632543
Isi direktori:
  - b.txt
  - a.txt

File deleteOnExit: /tmp/auto-12915893438600436669.tmp (akan dihapus saat JVM keluar)
Cleanup eksplisit selesai

Mari kita bedah baris-baris kode di atas:

  1. Files.createTempFile("notepad-", ".txt"): membuat file sementara dengan prefix notepad- dan suffix .txt. Nama lengkapnya menjadi /tmp/notepad-<angka-acak>.txt. File dibuat kosong.
  2. Files.write(tmpFile, ...): menulis byte array ke file, menggantikan isi yang ada. Pendekatan atomik dan sederhana untuk data kecil.
  3. Files.readString(tmpFile): membaca seluruh isi file sebagai String (UTF-8 default). Tersedia sejak Java 11.
  4. Files.createTempDirectory("work-"): membuat direktori sementara dengan prefix work-. Otomatis dapat permission rwx------ di POSIX.
  5. tmpDir.resolve("a.txt"): menggabungkan path direktori dengan nama file. Mengembalikan Path baru tanpa memeriksa keberadaan file.
  6. Files.list(tmpDir).forEach { ... }: mengiterasi isi direktori. Files.list mengembalikan Stream<Path> yang harus ditutup, tetapi forEach di sini menutupnya otomatis.
  7. File.deleteOnExit(): mendaftarkan file untuk dihapus saat JVM berhenti. Berguna untuk file cache berumur panjang, tetapi tidak menghapus file jika JVM crash.
  8. Files.deleteIfExists(path): menghapus file atau direktori kosong. Tidak melempar exception jika file tidak ada — aman untuk cleanup idempoten.

Pola Cleanup yang Andal #

Pola terbaik adalah membungkus penggunaan temporary file dalam blok try-finally:

kotlin
val tmpFile = Files.createTempFile("job-", ".tmp")
try {
    // gunakan tmpFile di sini
    Files.write(tmpFile, data)
    proses(Files.readString(tmpFile))
} finally {
    Files.deleteIfExists(tmpFile)
}

Untuk resource yang mengimplementasikan AutoCloseable (seperti BufferedReader), gunakan .use { } yang merupakan extension function Kotlin:

kotlin
Files.newBufferedReader(tmpFile).use { reader ->
    reader.forEachLine { line -> println(line) }
}

Menentukan Direktori Temporari #

Secara default, file sementara dibuat di direktori yang ditentukan oleh property sistem java.io.tmpdir. Kita bisa override:

kotlin
val customDir = Path.of("/var/cache/myapp")
val tmp = Files.createTempFile(customDir, "cache-", ".bin")

Pastikan direktori tujuan sudah ada dan aplikasi punya permission menulis ke sana.

Best Practice #

  • Selalu lakukan cleanup eksplisit — jangan andalkan OS.
  • Gunakan prefix yang mendeskripsikan asal file (mis. upload-, cache-) untuk memudahkan debug.
  • Batasi umur file dengan timestamp di nama jika perlu retention.
  • Untuk data sensitif, gunakan Files.setPosixFilePermissions(file, PosixFilePermissions.fromString("rw-------")) setelah membuat file.

Referensi Lanjutan #

Selanjutnya #

Sekarang kita sudah bisa membaca, menulis, dan mengelola file. Chapter berikutnya, Serialization Fundamentals, akan membahas cara mengubah objek menjadi urutan byte agar bisa disimpan atau dikirim melalui jaringan.