Я пытаюсь написать самый быстрый и оптимальный способ сохранения файлов. Есть ли способ получить размер блока системы в java? Что-то вроде System.getProperty("block.size")
или что-то в этом роде.
Получить размер системного блока в Java
Ответ 1
"Самый быстрый наиболее оптимальный способ" - это, безусловно, писать, используя самый большой буфер, который вы можете себе позволить; чтобы убедиться, что его размер равен двум (на ум приходит мегабайт); и чтобы убедиться, что сами записи выравниваются по буферу:
new BufferedOutputStream(new FileOutputStream(file), 1024*1024);
До тех пор, пока вы превысите размер системного блока, который вы будете с таким размером и остаетесь в нем, что гарантируется BufferedOutputStream
, это примерно так же оптимально, как и получается.
Вы также должны заглянуть в FileChannel.transferTo()
, отметив, что вы должны вызывать его в цикле и что фактические реализации до сих пор не используют примитивы операционной системы низкого уровня (в отличие от рекламы), просто тот же самый цикл, который вы могли бы написать себе.
Ответ 2
Я не думаю, что для этого есть java-функция. Однако существует системный зависимый способ получения этой информации. Посмотрите на этот ответ. Вам нужно будет использовать Runtime.exec() и проанализировать данные.
Ответ 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
Это решение позволяет вам иметь буферы, которые достаточно велики, чтобы быть оптимальными.