Java MappedByteBuffer.isLoaded()

pet*_*erh 6 java nio bytebuffer

在我看来,MappedByteBuffer.isLoaded()始终false在Windows上返回.当我在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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我明白这load()只是一个提示,但是我在这里使用的尺寸很小,我希望isLoaded()在某些时候能够恢复原状.如上所述,这似乎与Windows操作系统有关.它基本上意味着isLoaded()绝对没用.

也许我应该补充一点,MappedByteBuffer即使isLoaded()总是返回false ,我在Windows上的工作也绝对正常并具有出色的性能.所以当它说它没有加载时我真的不相信它.

使用Oracle Java 7更新9在Windows 7上进行测试.

seo*_*.ch 3

不,你不应该担心。

根据http://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html,该行为依赖于“底层操作系统”的实现。

“返回值 false 并不一定意味着缓冲区的内容不驻留在物理内存中。”