Java에서 file을 memory로 mapping시키는 방법은 두 가지가 있다.
val channel = FileChannel.open(file.toPath(), StandardOpenOption.READ)
val byteBuffer = channel.map(FileChannel.MapMode.READ_ONLY, 0L, size)
val arena = Arena.ofConfined()
val channel = FileChannel.open(file.toPath(), StandardOpenOption.READ)
channel.map(FileChannel.MapMode.READ_ONLY, 0L, size, arena)
여기서 arena는 Java 22에서 추가된 JVM에서 native memory segments를 관리하는 foreign function api이다..
덧붙여 Android에서 주로 사용하던 file system은 FileInputStream/FileOutputStream인데, 여기에서는 FileChannel이 나왔다.
그래서 FileChannel에 대하여 조금 알아보겠다..
FileChannel은 Java NIO에서 나온 개념으로, FileOutputStream에 비해 큰 파일, 랜덤 액세스 및 성능이 중요한 곳에서 처리하는데 적합하다.
그렇다고 무조건 FileOutputStream, FileInputStream을 쓰는 것보다 FileChannel이 좋은가? 라고 하면 그렇지는 않다.
FileChannel은 랜덤액세스 및 lock 기능 등등의 기능을 제공하기 때문에 불특정 다수의 스레드에서 접근하거나, 일시정지 및 재개와 같은 다운로드 전략이 필요할 때 혹은 용량이 큰 파일의 경우에 선택하면 된다.
Android 환경에서는 FileChannel을 쓸 일이 많지는 않을 것 같다..
현재 프로젝트에서.. 빌드를 시작할 때 임베디드 모듈을 받아오는 과정이 있는데 해당 모듈의 용량이 몇백mb 정도는 되어서 여기에 적용해볼법할 것 같다..