fun saveFile(inputStream: InputStream, filePath: String) {
//저장할 파일
val saveFile = File(filePath)
saveFile.outputStream().use { fileOutput ->
inputStream.copyTo(fileOutput)
}
}
기존에 루프(Loop)를 돌면서 버퍼를 읽는 방식 대신, 코틀린에서 지원하는 copyTo() 기능으로 아주 간편하게 바이트를 복사할 수 있고, use() 함수가 I/O resource를 자동으로 관리해주기 때문에, 초간단하게 파일 저장 코드를 구현할 수가 있습니다!
확장 함수를 이용해서, 더 멋지게 만들기!
코틀린에는 마치 기존 클래스에 구현된 기능인 것처럼 추가적인 함수를 커스텀하여 사용할 수 있는 확장 함수 기능이 있기 때문에, 위의 파일 저장 코드를 확장 함수로 더 멋지게 만들어 보겠습니다!
(저는 기존 'saveFile' 함수명을 확장 함수스럽게 만들기 위해서 'toFile'로 바꿔보았습니다.)
/** InputStream 클래스 확장 */
fun InputStream.toFile(filePath: String) {
File(filePath).outputStream().use { fileOutput ->
this.copyTo(fileOutput)
}
}
InputStream 클래스를 확장하여, 파일을 저장하는 확장함수를 구현해보았고,
이렇게 구현한 확장함수를 다음과 같이 사용한다면, 아주 유용하고 간편하게 파일 저장 기능을 사용할 수 있습니다!^^
/** 서버에서 파일 다운로드하는 예제 */
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
if (response.isSuccessful) {
response.body()?.byteStream().toFile(filePath)
}
}
'코틀린' 카테고리의 다른 글
코틀린(Kotlin) - 지연 계산(lazy) 컬렉션 연산 : Sequence (0) | 2020.04.24 |
---|---|
코틀린(Kotlin) - 컬렉션 API : filter, map, all, any, count, find, groupBy, flatMap, flatten (1) | 2020.04.03 |
코틀린(Kotlin) - 람다 식과 멤버 참조 (0) | 2020.03.17 |
코틀린(Kotlin) - object 키워드 : 싱글톤, static 멤버, 객체 식 선언 (1) | 2020.03.05 |
코틀린(Kotlin) - 데이터 클래스와 클래스 위임(by) (0) | 2020.03.03 |