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 line

Writing 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,85

Writing 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

Leave a Comment

Your email address will not be published. Required fields are marked *