获取Java中的系统块大小

时间:2012-05-07 14:46:52

标签: java optimization file-io operating-system system

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

4 个答案:

答案 0 :(得分:5)

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

new BufferedOutputStream(new FileOutputStream(file), 1024*1024);

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

没有系统属性,但您可以根据自己的需要使用任何Java用途,并确保这对您的OS / Java版本组合最佳。

此解决方案利用Java buf类中使用的BufferedXXXStream来保存数据的事实是protected变量,而不是private变量:

class IdealBlockSize {
    // You could alternatively use BufferedInputStream and System.in .
    private static class MyBufferedOS extends BufferedOutputStream {
        public MyBufferedOS() { super(System.out); }
        public MyBufferedOS(OutputStream out) { super(out); }
        public int bufferSize() { return buf.length; }
    }

    public static int VALUE = new IdealBlockSize.MyBufferedOS().bufferSize();
}

然后,您可以在应用程序启动代码中调用它们,如下所示:

System.out.printf("Ideal block size: %d\n", IdealBlockSize.VALUE);

// Output
// Ideal block size: 8192

此解决方案允许您使 的缓冲区足够大,以达到最佳效果。

答案 3 :(得分:1)

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

    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");
            }
        }
    }