안드로이드에서 앱을만들다보면 데이터들을 받아와야하지만 해당 서비스가 아직 개발단계거나 테스트중이라면 목업 데이터를 이용합니다. 이때 안들로이드는 assets 디렉토리를 만들어 Json파일을 넣어 해당 파일을 InputStream으로 읽어 올수있습니다.
InputStream은 자바에서 데이터를 바이트 스트림으로 읽어들이는 데 사용되는 추상 클래스입니다. 이 클래스는 바이트 단위로 데이터를 읽어들이는 기능을 제공하며, 파일, 네트워크 연결, 메모리 등 다양한 소스에서 데이터를 읽어올 수 있습니다.
InputStream은 데이터를 읽어들이는 동안에는 데이터의 소스에 대한 상세 내용을 알 필요가 없으며, 단순히 바이트 스트림으로 데이터를 읽어들이는 역할을 수행합니다. 이러한 특성 때문에 다양한 데이터 소스에서 일관된 방식으로 데이터를 읽어올 수 있습니다.
InputStream에서 바이트 배열에 데이터를 읽어옵니다. 읽은 바이트 수를 반환하며, 읽은 데이터가 없을 경우 -1을 반환합니다.
InputStream에서 바이트 배열의 지정된 오프셋(off)부터 지정된 길이(len)만큼 데이터를 읽어옵니다. 읽은 바이트 수를 반환하며, 읽은 데이터가 없을 경우 -1을 반환합니다.
InputStream에서 읽어올 수 있는 데이터의 예상 바이트 수를 반환합니다. 실제 읽을 수 있는 데이터 양과 정확히 일치하지 않을 수 있습니다.
InputStream에서 지정된 바이트 수(n)만큼을 건너뜁니다. 건너뛴 바이트 수를 반환하며, 실제로 건너뛴 바이트 수와 일치하지 않을 수 있습니다.
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