在我看来,MappedByteBuffer.isLoaded()在Windows上始终返回false
。当我说BSD Unix时,我使用相同的测试数据得到true
。
我应该担心吗?
无论我使用什么大小的数据,我基本上都无法使isLoaded()
在Windows上返回true。
这是我的测试代码以供引用:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MemMapTest {
private static final String FILENAME = "mydata.dat";
private static final int MB_1 = 1048576; // one Mbyte
private static final byte[] testData = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // len = 10 bytes
public static void main(String[] args) throws FileNotFoundException, IOException {
// Create a 10 Mb dummy file and fill it with dummy data
RandomAccessFile testFile = new RandomAccessFile(FILENAME, "rw");
for (int i = 0; i < MB_1; i++) {
testFile.write(testData);
}
MappedByteBuffer mapbuf = testFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, MB_1 * 20).load();
testFile.close();
if (mapbuf.isLoaded()) {
System.out.println("File is loaded in memory");
} else {
System.out.println("File is NOT loaded in memory");
}
}
}
我知道
load()
只是一个提示,但是我在这里使用的字体如此小,我希望isLoaded()
在某些时候返回true。如前所述,这似乎与Windows OS有关。这基本上意味着isLoaded()
绝对没有用。也许我应该补充一点,即使
MappedByteBuffer
始终返回false,我在Windows上的isLoaded()
仍然可以正常工作并且具有出色的性能。因此,当它说未加载时,我并不十分相信。使用Oracle Java 7 Update 9在Windows 7上进行了测试。
最佳答案
不,您不必担心。
根据http://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html,行为取决于“基础操作系统”的实现。
“返回值为false并不一定意味着缓冲区的内容未驻留在物理内存中。”
关于Java MappedByteBuffer.isLoaded(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15112448/