2011-09-24 4 views
2

그래서 매핑 된 FileChannel을 사용하여 매우 큰 파일을 읽으려고합니다.Java 가능 FileChannel.map 버그

파일이 2GB를 초과합니다. 코드의 단편이다

long fileSize = 0x8FFFFFFFL; 
FileChannel fc = new RandomAccessFile("blah.huge", "rw").getChannel(); 
fc.map(FileChannel.MapMode.READ_WRITE, 0, fileSize); 

이 오류가 발생합니다 :

Exception in thread "main" java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE 
    at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:789) 

FileChannel.map 파일 크기로 long 걸립니다. 그렇다면이 오류가 의미가 있습니까? 왜 그들은 그보다 더 큰 파일에 대한 지원을 제공하지 않을까요?

+0

문서화 된대로 작업하십시오, downvote. – EJP

+1

+1 : 한계가 있음을 문서화한다고해서 의미가있는 것은 아닙니다. –

답변

4

이 함수가 사용하는 기본 메서드는 오류를보고하지 않고 long 값을 사용합니다. 리플렉션을 사용하여 호출 할 수 있습니다. 그러나 그들이 당신의 시스템에서 당신을 위해 일하는 지 테스트 해보고 이런 방식으로 메모리 맵핑을 사용하면 당신을 혼란스럽게 할 수 있습니다.

가장 좋은 방법은 MappedByteBuffers 배열을 만드는 것입니다. 크기가 각각 1GB이고이 추함을 숨기는 래퍼를 만듭니다.

기술적으로 버그는 아니지만 잘못 설계된 것입니다. 원래이 작업이 수행 된 이유 중 일부는 32 비트 JVM이이를 지원할 수 없다는 것을 나타낼 수 있지만 64 비트 JVM이 아직 지원되지 않는 이유는 아닙니다. 이 한계가있다.

2

이것은 버그가 아닙니다. FileChannel#mapInteger.MAX_VALUE보다 크지 않은 size 인수를 요구하는 것으로 문서화되어 있습니다. ByteBuffer#getindex 매개 변수에 대해 정수를 취합니다.

+0

흥미 롭군요 ... 왜지도 함수가 크기에 대해 'long'을 사용합니까? – Andrew

+0

나는 다른'FileChannel' 메쏘드와 동질성을 가졌거나 바보가 아닌'ByteBuffer'를 기대한다고 가정합니다; 나는 비록 정당화를 찾을 수 없었고, 하나를 듣는 데 매우 흥미가있었습니다. – Hugh

+0

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7147951 – GKislin

관련 문제