CS/Kotlin

[Kotlin 문법] 11. 입출력 (2) - 파일 입출력

졔졔311 2025. 2. 11. 10:37
728x90
반응형

입출력에는 콘솔 입출력, 파일 입출력, 네트워크 입출력의 세 가지 종류가 있다.

그 중에서 콘솔 입출력은

2025.02.11 - [CS/Kotlin] - [Kotlin 문법] 10. 입출력 (1) - 콘솔 입출력, 문자열 포맷팅(출력 형식 지정)

여기에서 설명하였고, 이번에는 파일 입출력에 대해 알아보겠다.

 

파일 읽기

파일을 읽을 때는 두 가지 방법이 있다.

여기서는 모두 java.io.File을 import하여 이용한다.

1) readText()

- 파일 전체를 읽는 방법

import java.io.File

fun main() {
    val file = File("test.txt")

    val content = file.readText()
    println("$content")
}

 

2) readLines()

- 파일을 줄 단위로 읽기

import java.io.File

fun main() {
    val file = File("test.txt")

    val lines = file.readLines()
    for (line in lines) {
        println("$line")
    }
}

 


파일 쓰기

파일에 쓰는 방법은 파일에 덮어쓰거나, 문자열을 추가하는 방법이 있다.

1) writeText()

- 파일에 문자열 저장(덮어쓰기)

import java.io.File

fun main() {
    val file = File("test.txt")

    file.writeText("Hello, Kotlin!\n")
}

 

2) appendText()

- 파일에 문자열 추가(append)

import java.io.File

fun main() {
    val file = File("test.txt")

    file.appendText("이것은 파일에 추가된 텍스트입니다.\n")
}

 


Buffered~를 활용한 파일입출력 속도 향상

파일 입출력에는 이전 시간에 다룬 BufferedReader, BufferedWriter를 사용하면 속도를 크게 향상할 수 있다.

 

파일 입력

입력 시에 readText()나 readLines()를 사용해 한 번에 읽어들이면, 파일 크기가 커지면 메모리 사용량이 급격하게 증가하게 된다.

따라서, 큰 파일을 다룰 때 BufferedReader를 사용해 속도 향상을 노려야 한다.

BufferedReader는 한 줄씩 읽어 메모리 사용을 줄이고, 빠른 입출력을 위해 버퍼를 사용해 효율적이다.

import java.io.BufferedReader
import java.io.FileReader

fun main() {
    val reader = BufferedReader(FileReader("input.txt"))

    var line: String? = reader.readLine()
    while (line != null) {
        println(line)  // 한 줄씩 출력
        line = reader.readLine()  // 다음 줄 읽기
    }

    reader.close()
}

위의 코드를 보면, FileReader()를 사용해 파일에서 읽어들이고, readLine()을 사용해 null이 나올 때까지 한 줄씩 읽어 출력하는 과정을 반복한다.

한 번에 메모리에 로드하는 과정이 없기 때문에 메모리를 적게 사용한다.

 

이 코드를 조금 더 간결하게 바꾸면, 다음과 같이 use{} 블록을 사용할 수 있는데, 이 블록을 사용하면 자동으로 close()를 호출한다.

또한, 그 안에서 forEachLine{}을 사용해 코드를 간결하고 빠르게 만들 수 있다.

import java.io.BufferedReader
import java.io.FileReader

fun main() {
    BufferedReader(FileReader("input.txt")).use { reader ->
        reader.forEachLine { println(it) }  // 한 줄씩 읽어 처리
    }
}

 

정리하면, 다음과 같다.

방법 속도 메모리 사용량 사용법
readText() 느림 높음 (파일 전체를 메모리에 로드) 작은 파일 읽을 때
readLines() 보통 보통 (한 줄씩 리스트에 저장) 중간 크기 파일
BufferedReader.readLine() 빠름 낮음 (한 줄씩 읽음) 큰 파일 읽을 때 최적
BufferedReader.forEachLine() 매우 빠름 낮음 (메모리 효율적) 간결하고 성능 좋은 방법

 

파일 출력

출력 시에 writeText()를 사용하면, 매번 파일을 새로 쓰기 때문에 속도가 느리다.

또한, appendText()를 사용하면 작은 데이터에는 적절하지만, 대량의 데이터를 여러 번 쓰면 속도가 느려진다.

따라서 데이터를 버퍼에 모아서 한 번에 출력하는 BufferedWriter를 사용하면 효율적이다.

 

기본적으로, FileWriter를 사용하면 된다.

import java.io.BufferedWriter
import java.io.FileWriter

fun main() {
    val writer = BufferedWriter(FileWriter("output.txt"))

    writer.write("Hello, Kotlin!\n")
    writer.write("BufferedWriter 출력.\n")

    writer.flush()
    writer.close()
}

 

이 코드를 간결하게 만들기 위해, use{} 블록을 사용할 수 있다. (read 때와 마찬가지로, 자동으로 close()를 출력해 메모리 누수를 방지할 수 있다.)

import java.io.BufferedWriter
import java.io.FileWriter

fun main() {
    BufferedWriter(FileWriter("output.txt")).use { writer ->
        writer.write("Hello, Kotlin!\n")
        writer.write("use()를 활용\n")
    }
}

 

정리하면, 다음과 같다.

방법 속도 특징
writeText() 느림 파일을 덮어쓰기 (한 번에 저장)
appendText() 보통 파일에 내용 추가 (작은 데이터에 적합)
FileWriter.write() 보통 1줄씩 파일에 바로 저장 (버퍼 없음)
BufferedWriter.write() 빠름 버퍼에 저장 후 한 번에 파일에 씀

 

728x90
반응형