获取Java中的系统块大小

ken*_*dds 13 java optimization file-io operating-system system

我正在尝试编写最快,最优的文件保存方法.有没有办法在java中获取系统块大小?喜欢System.getProperty("block.size")什么东西.

use*_*279 5

我认为没有Java函数可以做到这一点。但是,有一种依赖于系统的方式来检索该信息。看看这个答案。您将需要使用Runtime.exec()并解析数据。


use*_*421 5

"最快的最佳方式"肯定是使用你能承受的最大缓冲区写的; 确保它的大小是2的幂(想到一兆字节); 并确保写入本身是缓冲区对齐的:

new BufferedOutputStream(new FileOutputStream(file), 1024*1024);
Run Code Online (Sandbox Code Playgroud)

只要你超过系统块大小,你就会达到这个大小,并且保持与它对齐,这是由它保证的BufferedOutputStream,这几乎是最佳的.

您还应该查看FileChannel.transferTo(),注意您必须在循环中调用它,并且到目前为止实际的实现似乎没有使用任何低级操作系统原语(与广告相反),只是同样的循环你可以自己写


Ani*_*Das 5

从 Java 9 开始,您可以使用 FileSystem 和 FileStore 类根据本机操作系统实现的文件系统获取系统磁盘块大小。代码如下:

    FileSystem fs = FileSystems.getDefault();
    Iterable<Path> roots = fs.getRootDirectories();
    for (FileStore store: fs.getFileStores()) {
        Iterator<Path> i = roots.iterator();
        while(i.hasNext()) {
            if(store.name().startsWith(i.next().toString())) {
                System.out.println("Name: " + store.name() + ", Read only: " + store.isReadOnly() + ", Type: " + store.type() + ", Block: " + store.getBlockSize() + " Bytes");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)