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.
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:
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 selesaiMari kita bedah baris-baris kode di atas:
Files.createTempFile("notepad-", ".txt"): membuat file sementara dengan prefixnotepad-dan suffix.txt. Nama lengkapnya menjadi/tmp/notepad-<angka-acak>.txt. File dibuat kosong.Files.write(tmpFile, ...): menulis byte array ke file, menggantikan isi yang ada. Pendekatan atomik dan sederhana untuk data kecil.Files.readString(tmpFile): membaca seluruh isi file sebagai String (UTF-8 default). Tersedia sejak Java 11.Files.createTempDirectory("work-"): membuat direktori sementara dengan prefixwork-. Otomatis dapat permissionrwx------di POSIX.tmpDir.resolve("a.txt"): menggabungkan path direktori dengan nama file. MengembalikanPathbaru tanpa memeriksa keberadaan file.Files.list(tmpDir).forEach { ... }: mengiterasi isi direktori.Files.listmengembalikanStream<Path>yang harus ditutup, tetapiforEachdi sini menutupnya otomatis.File.deleteOnExit(): mendaftarkan file untuk dihapus saat JVM berhenti. Berguna untuk file cache berumur panjang, tetapi tidak menghapus file jika JVM crash.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:
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:
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:
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 #
- Kotlin stdlib kotlin.io
— paket
kotlin.ioyang menyediakancreateTempFiledancreateTempDir - Java SE 21 Files
— dokumentasi
FilesJava SE 21 untukcreateTempFiledancreateTempDirectory
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.