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 공식문서