Android InputStream으로 파일 읽어오기

김성환·2024년 4월 8일

안드로이드에서 앱을만들다보면 데이터들을 받아와야하지만 해당 서비스가 아직 개발단계거나 테스트중이라면 목업 데이터를 이용합니다. 이때 안들로이드는 assets 디렉토리를 만들어 Json파일을 넣어 해당 파일을 InputStream으로 읽어 올수있습니다.

여기서 InputStream은 무었일까요?

InputStream은 자바에서 데이터를 바이트 스트림으로 읽어들이는 데 사용되는 추상 클래스입니다. 이 클래스는 바이트 단위로 데이터를 읽어들이는 기능을 제공하며, 파일, 네트워크 연결, 메모리 등 다양한 소스에서 데이터를 읽어올 수 있습니다.

InputStream은 데이터를 읽어들이는 동안에는 데이터의 소스에 대한 상세 내용을 알 필요가 없으며, 단순히 바이트 스트림으로 데이터를 읽어들이는 역할을 수행합니다. 이러한 특성 때문에 다양한 데이터 소스에서 일관된 방식으로 데이터를 읽어올 수 있습니다.

read(byte[] b) : int

InputStream에서 바이트 배열에 데이터를 읽어옵니다. 읽은 바이트 수를 반환하며, 읽은 데이터가 없을 경우 -1을 반환합니다.

read(byte[] b, int off, int len) : int

InputStream에서 바이트 배열의 지정된 오프셋(off)부터 지정된 길이(len)만큼 데이터를 읽어옵니다. 읽은 바이트 수를 반환하며, 읽은 데이터가 없을 경우 -1을 반환합니다.

available() : int

InputStream에서 읽어올 수 있는 데이터의 예상 바이트 수를 반환합니다. 실제 읽을 수 있는 데이터 양과 정확히 일치하지 않을 수 있습니다.

skip(long n) : long

InputStream에서 지정된 바이트 수(n)만큼을 건너뜁니다. 건너뛴 바이트 수를 반환하며, 실제로 건너뛴 바이트 수와 일치하지 않을 수 있습니다.

close() : void

InputStream을 닫습니다. 사용 후에는 명시적으로 닫아주어야 합니다. 닫힌 InputStream에 대해 read()나 available() 같은 메서드를 호출하면 IOException이 발생합니다.


fun <T> Context.readData(fileName: String, classT: Class<T>): T? {
    return try {
    	
        val inputStream = this.resources.assets.open(fileName)
        // Context 객체의 resources를 통해 assets 디렉토리에서 fileName에 해당하는 파일을 엽니다. 이 때, 열린 파일에 대한 InputStream 객체를 반환합니다.
        val byteArray = ByteArray(inputStream.available())
        // InputStream으로부터 읽어올 데이터의 크기에 해당하는 바이트 배열을 생성합니다.
        inputStream.read(byteArray)
        //InputStream으로부터 바이트 배열에 데이터를 읽어옵니다.
        inputStream.close()
        Gson().fromJson(String(byteArray), classT)
    } catch (e: IOException) {
        e.printStackTrace()
        null
    } catch (e: JsonSyntaxException) {
        e.printStackTrace()
        null
    }
}

이함수는 InputStream을 사용하여 파일을 읽어오는 함수의 예시입니다.


reference
https://developer.android.com/reference/kotlin/java/io/InputStream

0개의 댓글