我正在尝试编写最快,最优的文件保存方法。有没有办法在java中获取系统块大小?像System.getProperty("block.size")
或其他东西。
答案 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");
}
}
}