私は可能な限り最速で最適なファイル保存方法を書こうとしています。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
1つではないという事実を利用しています。
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クラスを使用して、ネイティブ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");
}
}
}