Подтвердить что ты не робот

Получить размер системного блока в Java

Я пытаюсь написать самый быстрый и оптимальный способ сохранения файлов. Есть ли способ получить размер блока системы в java? Что-то вроде System.getProperty("block.size") или что-то в этом роде.

4b9b3361

Ответ 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

Это решение позволяет вам иметь буферы, которые достаточно велики, чтобы быть оптимальными.