본문 바로가기

Study/Kotlin Study

[Kotlin] 파일과 I/O 스트림

+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.

I/O 관련 클래스

InputStream: Byte 단위로 입력을 읽어 온다.

- FileInputStream: 파일을 Byte 단위로 읽기 위한 클래스

 

OutputStream: Byte 단위로 출력한다.

- FileOutputStream: 파일을 Byte 단위로 쓰기 위한 클래스

 

Reader: 문자 단위로 입력을 읽어 온다.

- FileReader: 파일을 문자 단위로 읽기 위한 클래스

 

Writer: 문자 단위로 출력한다.

- FileWriter: 파일을 문자 단위로 쓰기 위한 클래스

 

< FileWriter 예제 코드 >

import java.io.FileWriter

fun main() {
    val writer = FileWriter("data.txt") // 쓰기 위한 텍스트 파일 지정 (없으면 생성)

    try {
        writer.write("a") // data.txt 파일에 "a" 작성 (1 byte)
        writer.write("가") // 바로 뒤에 "가" 작성 (3 byte)
    } finally {
        writer.close() // 문제가 발생하더라도 반드시 writer를 닫아주어야 한다.
    }
}

 

< FileReader 예제 코드 >

import java.io.FileReader
import java.io.FileWriter

fun main() {
    val reader = FileReader("data.txt") // // 읽기 위한 텍스트 파일 지정
    try {
        val first = reader.read().toChar() // 한 글자를 읽어올 때, Int로 반환되기 때문에 문자로 변환
        val second = reader.read().toChar()

        println("$first $second") // a 가

        val third = reader.read()
        println("$third") // -1 (더 이상 읽을 것이 없으므로 -> 파일에 두 글자가 있다는 것을 알 수 있다.)

    } finally {
        reader.close() // 문제가 발생하더라도 반드시 writer를 닫아주어야 한다.
    }
}

 

< FileInputStream 예제 코드 >

import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter

fun main() {
    val inputStream = FileInputStream("data.txt")

    try {
        var idx = 0
        while (true) {
            val b = inputStream.read()
            if (b < 0) break // 더 이상 읽을 값이 없으면 -1을 반환하므로
            println("$idx: $b")
            idx += 1
        }
    } finally {
        inputStream.close()
    }
    // a: 1 byte, 가: 3 byte 이므로 4번 반복한다.
}

use 함수

전통적인 I/O 연산이다.

- close()를 사용하지 않아도 자동으로 닫을 수 있다.

- {} 내에서 it을 사용할 수 있다.

 

< FileInputStream 예제에 적용 >

import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter

fun main() {
    FileInputStream("data.txt").use{ // FileInputStream("data.txt") 객체가 it이 된다.
        var idx = 0
        while (true) {
            val b = it.read()
            if (b < 0) break // 더 이상 읽을 값이 없으면 -1을 반환하므로
            println("$idx: $b")
            idx += 1
        }
    }
}

 

< FileReader 예제에 적용 >

import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter

fun main() {
    FileReader("data.txt").use{
        var idx = 0
        while (true) {
            val b = it.read()
            if (b < 0) break
            println("$idx: ${b.toChar()}")
            idx ++
        }
    }
}

스트림 전체 읽어오기

import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter

fun main() {
    FileWriter("data.txt").use{
        it.write("One\nTwo\nThree")
    }

    // 줄 단위로 읽기 위해 buffered 사용
    FileReader("data.txt").buffered().use {
        println(it.readLine()) // 한줄만 출력
    }

    FileReader("data.txt").use {
        println(it.readText()) // 줄 별로 '\n'을 적용하여 한번에 출력
    }

    println(FileReader("data.txt").readLines()) // [One, Two, Three] (리스트에 담겨서 출력)
    // 자동으로 close() 실행

    println(FileReader("data.txt").readLines().forEachIndexed {idx, line -> println("$idx: $line")})
}

 

import java.io.FileInputStream
import java.io.FileReader
import java.io.FileWriter

fun main() {
    // data.txt의 전체를 줄별로 리스트에 담고 it이 그 리스트를 가리킨다.
    FileReader("data.txt").useLines { 
        it.forEachIndexed { idx, line ->
            println("$idx: $line")
        }
    }
    
    // data.txt에서 줄별로 실행할 코드를 안에 작성한다. (it은 그 줄에 있는 String을 가리킨다.)
    FileReader("data.txt").forEachLine {
        println("$it")
    }
}

'Study > Kotlin Study' 카테고리의 다른 글

[Kotlin] 제네릭스  (0) 2023.11.28
[Kotlin] 컬렉션 유틸리티  (1) 2023.11.21
[Kotlin] 컬렉션 타입  (0) 2023.11.20
[Kotlin] 봉인된 클래스  (1) 2023.11.14
[Kotlin] 부호 없는 정수  (0) 2023.11.14