Java에서 MemoryMapped File SW

Android에서 개발을 해 왔는데, 문득 Java에서 mmap()에 해당하는 기능을 사용하지 않았다는 생각이 들었습니다. 생각 해 보면 주로 database (sqlite)나 shared preference 관련 기능을 사용했고, multi process가 아닌 상황에서 대용량 파일을 직접 읽을 일이 없어서 해당되는 기능을 사용 할 필요성을 거의 느끼지 못해서라고 말 할 수 있겠네요.

실제로 해당 기능을 찾아보니 Java 1.4의 java.nio.channels.FileChannel.map() 함수에 의해서 지원되고 반환되는 것은 ByteBuffer를 상속받는 MappedByteBuffer 입니다. 다행히 Android에서도 사용 할 수 있네요.

다만 실제로 반환되는 것이 C/C++의 메모리 주소와는 다르게 ByteBuffer라는 점이 아마도 사용성 측면에서 크게 차이가 나겠습니다. 메모리로 반환되는 경우 mapping 후에 바로 해당 메모리를 이미 알고 있는 구조체처럼 사용 할 수 있는데, Java에서는 ByteBuffer를 반환하기 때문에 특정한 position의 값을 읽어 오는 식으로 접근해야 합니다. 물론 간단한 wrapper를 이용해서 비슷하게 사용 할 수 있긴 합니다.

구체적인 사용 예는 Power of Java Memory Mapped File 을 참고하세요.