Kotlin File Writing
Kotlin provides straightforward APIs for writing text and binary data to files. You can create new files, overwrite existing ones, or append content — all with automatic resource management so you never accidentally leave a file handle open.
Writing Text to a File
import java.io.File
fun main() {
// Creates the file if it doesn't exist; overwrites if it does
File("output.txt").writeText("Hello, Kotlin File Writing!")
println("File written")
}Appending to a File
import java.io.File
fun main() {
val file = File("log.txt")
file.writeText("First line\n") // create/overwrite
file.appendText("Second line\n") // add to existing content
file.appendText("Third line\n")
println(file.readText())
}Output:
First line
Second line
Third lineWriting Multiple Lines
import java.io.File
fun main() {
val students = listOf("Alice,92", "Bob,78", "Carol,85")
File("scores.csv").printWriter().use { writer ->
writer.println("name,score") // header
students.forEach { writer.println(it) }
}
// .use ensures the writer is closed automatically
println(File("scores.csv").readText())
}Output:
name,score
Alice,92
Bob,78
Carol,85Writing with bufferedWriter
import java.io.File
fun main() {
File("report.txt").bufferedWriter().use { out ->
out.write("=== Monthly Report ===\n")
out.write("Total Sales: 5,240 units\n")
out.write("Revenue: ₹12,45,000\n")
out.newLine()
out.write("Generated by Kotlin")
}
println("Report written")
}Writing Bytes
import java.io.File
fun main() {
val data = byteArrayOf(72, 101, 108, 108, 111) // "Hello" in ASCII
File("binary.dat").writeBytes(data)
val read = File("binary.dat").readBytes()
println(String(read)) // Hello
}Creating Directories
import java.io.File
fun main() {
val dir = File("reports/2024/june")
dir.mkdirs() // creates all missing parent directories too
if (dir.exists()) {
println("Directory created: ${dir.absolutePath}")
File(dir, "summary.txt").writeText("June summary here")
}
}Write Flow Diagram
writeText("content") → overwrites entire file
File("path") ─┤ appendText("content") → adds to end of file
writeBytes(byteArray) → writes raw bytes
Advanced:
printWriter().use { } → line-by-line with println/write
bufferedWriter().use { } → buffered, efficient for many lines
Practical Example: CSV Report Generator
import java.io.File
data class SaleRecord(val date: String, val product: String, val qty: Int, val revenue: Double)
fun generateCsvReport(records: List, outputPath: String) {
File(outputPath).printWriter().use { writer ->
// Header
writer.println("Date,Product,Quantity,Revenue")
// Data rows
records.forEach { r ->
writer.println("${r.date},${r.product},${r.qty},${r.revenue}")
}
// Summary row
val totalRevenue = records.sumOf { it.revenue }
val totalQty = records.sumOf { it.qty }
writer.println()
writer.println("TOTAL,,${totalQty},${totalRevenue}")
}
println("Report saved to $outputPath")
}
fun main() {
val sales = listOf(
SaleRecord("2024-06-01", "Laptop", 5, 375000.0),
SaleRecord("2024-06-02", "Mouse", 20, 8000.0),
SaleRecord("2024-06-03", "Keyboard", 12, 14400.0),
SaleRecord("2024-06-04", "Monitor", 3, 45000.0)
)
generateCsvReport(sales, "sales_june.csv")
// Print what was written
println(File("sales_june.csv").readText())
} Output:
Report saved to sales_june.csv
Date,Product,Quantity,Revenue
2024-06-01,Laptop,5,375000.0
2024-06-02,Mouse,20,8000.0
2024-06-03,Keyboard,12,14400.0
2024-06-04,Monitor,3,45000.0
TOTAL,,40,442400.0