Так что я реализованный рабочую программу, которая ищет файл с помощью метода двоичного поиска:Двоичный поиск в буфере
public int BSearch(int x1, int x2) throws IOException {
int current_key;
middle=(x1+x2)/2;
if(x1>x2) {
middle=-1; //middle==-1 is condition of 'key not found'
return middle;
}
MyFile.seek(middle*4);
current_key=MyFile.readInt();
da++;
if(current_key==key) {
return middle;
}
else if(key<current_key) {
x2=middle-1;
return BSearch(x1,x2);
}
else {
x1=middle+1;
return BSearch(x1,x2);
}
}
Теперь я хочу, чтобы преобразовать его, чтобы он читает файл сдельного по-части (скажем, 1 КБ каждый раз) в буфер, а затем двоичный поиск этого буфера. Если ключ не найден в этом буфере, я читаю далее файл и так далее. Я хочу уточнить, однако, что буфер является ручной буфер, как это (поправьте меня):
byte[] buf = new byte[1024];
MyFile.read(buf);
ByteArrayInputStream bis= new ByteArrayInputStream(buf1);
DataInputStream ois= new DataInputStream(bis);
current_key=ois.readInt();
Большая проблема (среди прочих), я не знаю, как я буду читать с определенной позиции из buffer
И почему вы не можете использовать весь файл? –
Идея состоит в том, что я хочу использовать небольшие буферы, чтобы я мог обрабатывать большие файлы (например, 5 ГБ) одинаково. Конечно, я не смогу прочитать 5 ГБ в основной памяти. – xouris
Не думаю, что весь файл должен быть загружен в ОЗУ. Вы можете просто использовать 'seek' и читать соответствующие байты. Функция 'seek' принимает' long', которая может содержать до 8 экзабайт, которых должно быть достаточно. –