❌ Error Handling

Kotlin - mark, reset not supported

신건우 2023. 4. 30. 20:45

❌ Kotlin - mark, reset not supported

문제의 코드

inputStream.mark(2)
val bytes2 = ByteArray(2)
inputStream.read(bytes2, 0, 2)
println("바이트 배열 일부만 읽기 1 : " + bytes2.decodeToString())

inputStream.reset()
inputStream.read(bytes2, 0, 2)
println("바이트 배열 일부만 읽기 2 : " + bytes2.decodeToString())

원인

InputStream 객체가 mark()와 reset() 함수를 지원하지 않아서 예외가 발생합니다.

InputStream의 mark()와 reset() 함수는,

InputStream의 내부 포인터 위치를 저장하고, 나중에 해당 위치로 이동할 수 있도록 해줍니다.

그러나 일부 InputStream 구현체는 이러한 기능을 지원하지 않을 수 있습니다.


해결 방법

markSupported() 함수를 사용하여 mark()와 reset() 메소드를 지원하는지 확인한 후,

지원되는 경우에만 해당 함수를 호출하는 것입니다.

if (inputStream.markSupported()) {
    inputStream.mark(2)
    val bytes2 = ByteArray(2)
    inputStream.read(bytes2, 0, 2)
    println("바이트 배열 일부만 읽기 1 : " + bytes2.decodeToString())

    inputStream.reset()
    inputStream.read(bytes2, 0, 2)
    println("바이트 배열 일부만 읽기 2 : " + bytes2.decodeToString())
} else {
    println("mark/reset not supported")
}

이렇게 하면 mark()reset() 함수가 지원되는 경우에만 해당 코드 블록이 실행되므로 예외가 발생하지 않습니다.