Ответ 1
Чтобы ответить на ваш прямой вопрос: (1) файловые системы имеют тенденцию использовать полномочия 2, поэтому вы хотите сделать то же самое. (2) чем больше ваш рабочий буфер, тем меньше будет никакого искажения.
Как вы говорите, если вы выделите 4100, а фактический размер блока - 4096, вам понадобится два чтения для заполнения буфера. Если вместо этого у вас есть буфер объемом 1 000 000 байт, то для одного блока высокий или низкий значение не имеет значения (поскольку для заполнения этого буфера требуется 245 4096-байтовых блоков). Более того, больший буфер означает, что ОС имеет больше шансов заказать чтение.
Тем не менее, я бы не использовал NIO для этого. Вместо этого я бы использовал простой BufferedInputStream
, возможно, 1k-буфер для моих read()
s.
Основным преимуществом NIO является сохранение данных из кучи Java. Если вы читаете и записываете файл, например, с помощью InputStream
означает, что ОС считывает данные в буфер управления, управляемый JVM, JVM копирует это в буфер на куче, а затем копирует его снова в выключенное -heap buffer, тогда ОС считывает этот буфер с кучей для записи фактических блоков диска (и обычно добавляет свои собственные буферы). В этом случае NIO удалит экземпляры нативной кучи.
Однако, чтобы вычислить хеш, вам нужно иметь данные в куче Java, а Mac
SPI переместит его там, Таким образом, вы не получаете преимущества NBI, сохраняя данные с кучи, и IMO "старый IO" легче писать.
Просто не забывайте, что InputStream.read()
не гарантированно прочитает все байты, которые вы просите.