2011-09-24 68 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

此函數使用的本地方法在不報告錯誤的情況下取值很長。你可以用反射來給他們打電話。然而,你會測試它們是否在你的系統上爲你工作,並使用這種內存映射,可能會讓你感到困惑,而不是有用。

最好的方法是創建一個MappedByteBuffers數組,每個尺寸1 GB,並創建一個隱藏這個醜陋的包裝。

雖然技術上來說不是一個bug,它是壞的(破碎的設計)原因之一部分原因可能是32位JVM不能支持這一點,但我不明白爲什麼64位JVM仍然有這個限制。

2

這不是一個錯誤。 FileChannel#map被記錄爲需要不大於Integer.MAX_VALUE的參數size,這是合理的。 ByteBuffer#get的參數index取整數。

+0

有趣......爲什麼地圖功能需要一個「長」的大小呢? – Andrew

+0

我會假設它是爲了與其他'FileChannel'方法的同質性或預期的非愚蠢的'ByteBuffer';儘管我一直無法找到理由,並且會很樂意聽到一個。 – Hugh

+0

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