입출력에는 콘솔 입출력, 파일 입출력, 네트워크 입출력의 세 가지 종류가 있다.
그 중에서 콘솔 입출력은
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() | 빠름 | 버퍼에 저장 후 한 번에 파일에 씀 |
'CS > Kotlin' 카테고리의 다른 글
[Kotlin 문법] 12. 후행 람다 문법 (0) | 2025.03.05 |
---|---|
[Kotlin 문법] 10. 입출력 (1) - 콘솔 입출력, 문자열 포맷팅(출력 형식 지정) (0) | 2025.02.11 |
null safety - "?" 문법 (0) | 2025.01.08 |
[Kotlin 문법] 9. Null Safety (0) | 2024.06.13 |
[Kotlin 문법] 8. Class (1) | 2024.06.12 |