13

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

4

4 回答 4

6

“可能的最快最佳方式”肯定是使用您能负担得起的最大缓冲区进行写入;确保它的大小是 2 的幂(想到兆字节);并确保写入本身是缓冲区对齐的:

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

只要您超过系统块大小(您将处于此大小)并保持与它保持一致,这是由 保证的BufferedOutputStream,这几乎是最佳的。

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

于 2012-05-08T01:30:13.250 回答
5

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

于 2012-05-07T14:55:55.890 回答
3

没有 System 属性,但您可以使用 Java 使用的任何东西来满足自己的需要,并放心,这对您的 OS/Java 版本组合是最好的。

该解决方案利用了buf在 Java 的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

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

于 2013-12-26T10:11:36.937 回答
2

从 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");
            }
        }
    }
于 2018-06-25T10:34:25.490 回答