.array ()가 MAP의 FileChannels에서 반환 된 바이트 버퍼에서 작동하지 않습니까?
-
20-08-2019 - |
문제
자바에서 메모리 매핑 IO를하고 있습니다. Filechannel 클래스를 사용하면 바이 테 버퍼를 파일의 특정 부분에 매핑 할 수 있습니다. 파일이 열린 후 읽기 만하고 있습니다.
내가 가진 문제는 결과 바이 테 버퍼에서 .array () 메소드를 호출하려고 할 때 예외가 발생한다는 것입니다. 아마도 .array ()가 바이트 [] 배열을 반환하고 정말로 마무리 된 바이트 배열을 원하십니까?
이 주위에 어떤 방법이 있습니까?
해결책
나는 이것이에 관한 것이라고 가정 할 것이다 FileChannel.map
파일을 메모리에 매핑 할 수있는 메소드 MappedByteBuffer
.
문서에서 FileChannel.map
방법, 파일이 읽기 전용으로 매핑되면 버퍼를 수정하려는 모든 시도는 ReadOnlyBufferException
:
파일의 영역은 세 가지 모드 중 하나에서 메모리에 매핑 될 수 있습니다.
- 읽기 전용 : 결과 버퍼를 수정하려는 시도는
ReadOnlyBufferException
던져지기 위해. (MapMode.READ_ONLY
)
예외적으로 ByteBuffer.array
방법, 문제의 이유에 따라 던져지는 두 가지 유형의 예외가 있습니다.
던지기 :
ReadOnlyBufferException
-이 버퍼가 배열로 백업되지만 읽기 전용 인 경우UnsupportedOperationException
-이 버퍼가 접근 가능한 배열로 뒷받침되지 않는 경우
문제에 대한 예외는 언급되지 않았지만, 읽기 전용 파일은 아마도 ReadOnlyBufferException
에 의해 던져 질 array
방법.
또한, 그것은 또한 언급해야합니다 ByteBuffer.array
메소드는 선택적 작동입니다.
이 버퍼를 뒷받침하는 바이트 배열을 반환합니다 (선택적 작동).
확인하기 위해 array
메소드는 a를 반환합니다 byte[]
사용될 수 있습니다 hasArray
설명서에 제안 된 방법 array
방법:
호출
hasArray
이 버퍼에 액세스 가능한 백업 배열을 갖도록하기 위해이 메소드를 호출하기 전에 방법.