У меня есть логический метод сравнения файлов. Он получает часть bb и проверяется на равных. Если части равны - получите следующий блок. Если позиция (точка)> размер файла и все блоки равны - верните true. Работает с небольшими файлами (10 МБ), но есть проблемы на большом.ByteBuffer's equals
private static boolean getFiles(File file1, File file2) throws IOException {
FileChannel channel1 = new FileInputStream(file1).getChannel();
FileChannel channel2 = new FileInputStream(file2).getChannel();
int SIZE;
MappedByteBuffer buffer1, buffer2;
for (int point = 0; point < channel1.size(); point += SIZE) {
SIZE = (int) Math.min((4096*1024), channel1.size() - point);
buffer1 = channel1.map(FileChannel.MapMode.READ_ONLY, point, SIZE);
buffer2 = channel2.map(FileChannel.MapMode.READ_ONLY, point, SIZE);
if (!buffer1.equals(buffer2)) {
return false;
}
}
return true;
}
Как его изменить? Изменить размер блоков?
Я хотел бы попробовать гораздо меньшие блоки, вероятно, в диапазоне 16-128k или около того ... Не намного больше, что я могу думать, чтобы попробовать:) – xpa1492
см. Это http://stackoverflow.com/questions/964332/java-large-files-disk-io -performance – Dexter
Проблема заключается в том, что 'MappedByteBuffer' не имеет метода для освобождения ресурса, вместо этого он полагается на завершение, которое может происходить асинхронно и отсрочено, поэтому при распределении буферов в цикле вы можете запускать« OutOfMemoryError », даже когда старые буферы выходят за рамки. Я считаю это ошибкой дизайна Java API, но иногда вызов 'System.gc()' иногда может решить проблему. – Holger