我正在尝试编写最快、最优化的文件保存方法。有没有办法在java中获取系统块大小?什么东西之类System.getProperty("block.size")
的。
4 回答
“可能的最快最佳方式”肯定是使用您能负担得起的最大缓冲区进行写入;确保它的大小是 2 的幂(想到兆字节);并确保写入本身是缓冲区对齐的:
new BufferedOutputStream(new FileOutputStream(file), 1024*1024);
只要您超过系统块大小(您将处于此大小)并保持与它保持一致,这是由 保证的BufferedOutputStream
,这几乎是最佳的。
您还应该查看FileChannel.transferTo()
,注意您必须在循环中调用它,并且到目前为止的实际实现似乎没有使用任何低级操作系统原语(与广告相反),只是与您相同的循环可以自己写。
我不认为有一个java函数可以做到这一点。但是,有一种依赖于系统的方法来检索该信息。看看这个答案。您需要使用 Runtime.exec() 并解析数据。
没有 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
此解决方案允许您拥有足够大的缓冲区以达到最佳效果。
从 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");
}
}
}