MappedByteBuffer — 파일 매핑 버퍼

MappedByteBuffer — 파일 매핑 버퍼

메모리 맵 파일(memory-mapped file)을 나타내는 직접 바이트 버퍼예요. FileChannel.map 메서드로 파일의 영역을 메모리에 매핑해 만든 버퍼예요. 파일 내용이 가상 메모리에 매핑되어, 버퍼를 통해 파일을 읽고 쓸 수 있어요. 이 버퍼는 항상 직접(direct) 버퍼이며, 파일에 대한 접근을 운영체제의 가상 메모리 시스템에 위임해요.

출처: Java API Reference

본문

메모리 맵 버퍼의 내용은 언제든지 다른 프로그램이 바꿀 수 있어요(파일을 직접 수정하는 경우). 이 버퍼에 매핑된 파일 영역을 수정하는 방법은 매핑 모드에 따라 달라지며, 파일 등 저장 위치에 반영되는 시점도 구현에 따라 달라요. 매핑된 버퍼의 내용을 강제로 저장 장치에 기록하려면 force 메서드를 사용해요.

주요 메서드

  • public final boolean isLoaded() — 이 버퍼의 내용이 물리 메모리에 상주하는지 여부를 반환해요. true 반환은 내용이 메모리에 있다는 것을 의미하며, false 반환은 그렇지 않다는 것을 확실하게 의미해요.
  • public final MappedByteBuffer load() — 이 버퍼의 내용을 물리 메모리에 로드해요. 반환 시점에 이 버퍼의 내용이 메모리에 있도록 최선을 다해 노력해요.
  • public final MappedByteBuffer force() — 이 버퍼의 내용에 대한 변경 사항을, 매핑된 파일이 들어 있는 저장 장치에 기록하도록 강제해요. 전체 영역에 대해 적용돼요.
  • public final MappedByteBuffer force(int index, int length) — 이 버퍼 내용의 특정 영역에 대한 변경 사항을 저장 장치에 기록하도록 강제해요. index부터 length까지의 영역에 적용돼요.
  • public final MappedByteBuffer position(int newPosition) — 이 버퍼의 position을 설정해요. mark가 정의되어 있고 새 position보다 크면 mark는 버려져요.
  • public final MappedByteBuffer limit(int newLimit) — 이 버퍼의 limit을 설정해요.
  • public final MappedByteBuffer mark() — 이 버퍼의 표시를 position에 설정해요.
  • public final MappedByteBuffer reset() — position을 이전에 표시한 위치로 리셋해요.
  • public final MappedByteBuffer clear() — 이 버퍼를 비워요. position은 0, limit은 capacity, mark는 버려져요.
  • public final MappedByteBuffer flip() — 이 버퍼를 플립해요. limit은 현재 position, position은 0이 돼요.
  • public final MappedByteBuffer rewind() — 이 버퍼를 되감아요. position은 0, mark는 버려져요.
  • public abstract MappedByteBuffer slice() — 이 버퍼 내용의 공유 하위 시퀀스인 새 바이트 버퍼를 만들어요.
  • public abstract MappedByteBuffer slice(int index, int length) — 이 버퍼 내용의 공유 하위 시퀀스인 새 바이트 버퍼를 만들어요.
  • public abstract MappedByteBuffer duplicate() — 이 버퍼의 내용을 공유하는 새 바이트 버퍼를 만들어요.
  • public abstract MappedByteBuffer compact() — 이 버퍼를 컴팩트해요(선택 연산).
FileChannel channel = FileChannel.open(Paths.get("data.bin"),
    StandardOpenOption.READ, StandardOpenOption.WRITE);
MappedByteBuffer buf = channel.map(FileChannel.MapMode.READ_WRITE, 0, channel.size());
buf.putInt(0, 42);   // 파일의 첫 4바이트에 int 기록
buf.force();         // 저장 장치로 강제 반영

더 알아보기 (Learn more)