[kotlin] Flow를 사용하여 파일 처리하기

Kotlin에서 파일 처리를 수행하는 동안 비동기적인 작업을 처리해야 하는 경우 Flow를 사용할 수 있습니다.

Flow란?

Flow는 비동기적으로 값을 생성하는 코틀린의 새로운 비동기 시퀀스 컨셉입니다. Flow는 여러 개의 값을 만들어 내기 때문에, 단 하나의 값을 만들어 내는 Sequence와 달리 값의 시퀀스를 표현할 수 있습니다. 또한 Flow는 비동기 및 순차적인 처리, 에러 처리, 취소 등을 쉽게 처리할 수 있는 기능을 제공합니다.

파일 처리를 위한 Flow 사용하기

아래는 파일에서 데이터를 읽어오는 간단한 예제입니다. 다음 예제는 파일의 각 라인을 Flow로 읽어들이고, 각 라인에 대해 특정 작업을 수행합니다.

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import java.io.File

fun readFileAsFlow(filePath: String): Flow<String> = flow {
    val file = File(filePath)
    if (file.exists()) {
        file.forEachLine { line ->
            emit(line) // 각 라인을 Flow로 emit
        }
    } else {
        throw FileNotFoundException("File not found")
    }
}

위 코드에서 readFileAsFlow 함수는 파일에서 각 라인을 Flow로 읽어오는 함수를 정의하고 있습니다. flow { ... } 블록 내부에서 emit 함수를 사용하여 각 라인을 Flow로 emit합니다. 또한 파일이 존재하지 않는 경우에는 FileNotFoundException을 throw하여 예외 처리를 수행합니다.

Flow 사용하기

이제 readFileAsFlow 함수를 사용하여 파일을 읽어오고, 각 라인에 대해 작업을 수행하는 방법을 살펴보겠습니다.

fun main() {
    val filePath = "test.txt"
    readFileAsFlow(filePath)
        .onEach { line -> 
            // 각 라인에 대한 작업 수행
            println("Line: $line")
        }
        .catch { e -> 
            // 에러 처리
            println("Error occurred: $e")
        }
        .launchIn(GlobalScope) // Flow 실행
}

위 코드는 readFileAsFlow 함수를 호출하고, 각 라인에 대해 작업을 수행하며, 발생할 수 있는 예외를 catch하여 처리하는 예제입니다. 마지막으로 launchIn을 사용하여 Flow를 실행합니다.

이제 Flow를 사용하여 파일 처리를 비동기적으로 수행하는 방법에 대해 알아보았습니다.

참고자료: Kotlin Flow 공식문서