2009-06-28 3 views
4

Java에서 메모리 매핑 IO를하고 있습니다. FileChannel 클래스를 사용하면 ByteBuffer를 파일의 특정 부분에 매핑 할 수 있습니다. 나는 파일을 읽기 전용으로 열었습니다.map'ed FileChannels에서 반환 된 ByteBuffers에서 .array()가 작동하지 않습니다.

내가 겪고있는 문제는 결과 ByteBuffer에서 .array() 메서드를 호출하려고 할 때 예외가 발생한다는 것입니다. 아마도 그것은 .array()가 byte [] 배열을 반환하고 실제로 finalize 된 바이트 배열을 원하기 때문입니다.

이 문제가 발생합니까?

답변

3

여기서는 파일을 MappedByteBuffer으로 액세스 할 수있는 메모리에 매핑 할 수있는 FileChannel.map 메서드에 대한 것이라고 가정합니다. FileChannel.map 방법에 대한 설명서

파일은 읽기 전용으로 맵핑되는 경우, 버퍼를 수정하는 시도는 ReadOnlyBufferException 될 것이다

파일의 영역에 맵핑 될 수있다 세 가지 모드 중 하나 메모리 :

  • 읽기 전용 : 을 수정하려는 시도가 결과 버퍼가 ReadOnlyBufferException가 슬로우됩니다.

    예외 : (MapMode.READ_ONLY)

  • ByteBuffer.array 방법에 의해 발생 예외의 관점에서

문제에 대한 이유에 따라 슬로우되는 예외의 두 가지 유형

  • ReadOnlyBufferException -이 버퍼가 어레이에 의해 뒷받침되지만 읽기 전용 인 경우
  • UnsupportedOperationException - 버퍼가 액세스 배열에 연동되지 않으면

발생되는 예외는 질문에서 언급되어 있지 않지만, 아마도 파일은 읽기 전용되는 array 방법에 의해 발생 될 ReadOnlyBufferException 일으키는 .

이 완충액 (옵션)를 보조하는 바이트 배열을 반환

또한,도 ByteBuffer.array 방법은 임의의 오퍼레이션이라고 언급한다.

hasArray 메소드를 호출 이를 호출하기 전에 :

array 방법에 대한 설명서에 제시된대로 array 방법은 사용할 수있는 byte[]을 반환 hasArray 메소드를 호출하는지 확인하려면 메서드를 사용하여 에이 버퍼에 액세스 가능 백업 배열이 있는지 확인하십시오.

+0

물론 배열은 메모리에서 이동할 수 있으며 메모리 매핑 된 파일이나 직접 할당 된 버퍼와 잘 맞지 않는 헤더를 가질 수 있습니다. –

+0

그들이 메모리 맵핑되면, 그들은 움직이지 않을 것입니다 ... – vy32

+0

이것은 질문에 답해 주지만, 제가 원했던 대답이 아닙니다. POSIX mmap()에는 읽기 전용 메모리 매핑 문제가 없습니다. 자바도 그렇게해야합니다. – vy32