Как прочитать и перезаписать строку в большом файле?
Создал файл и читаю его с помощью BufferedReader. Все строки в файле начинаются с 13-ти значного числа. Если быть точнее - время в миллисекундах с 1 января 1970г. (классика) System.currentTimeMillis() Строки нужно отсортировать и выбрать самую старую запись. Код пишу из расчёта на чтение больших файлов.
int RAM = 1024;
long memory=0,
buffer=0;
long byteN = 0;
String line;
File file = new File(path);
StringBuilder str = new StringBuilder();
HashSet<String>littleDataList = new HashSet<String>();
BufferedReader br = new BufferedReader(new FileReader(file));
while((line=br.readLine())!= null) {
byteN+=line.length()+1;
str.append(byteN+"#").append(line+System.lineSeparator());
memory=byteN-buffer;
if (memory >= RAM) {
String part = str.toString();
String singleLine = bigSortLines(part);
littleDataList.add(singleLine);
//clear StringBuffer
str.delete(0, str.length());
buffer = byteN;
}
}
br.close();
После чтения, выбранную строку нужно вернуть на место в файл, но уже с новой, обновлённой датой. И в этом есть проблема... С кода выше можно заметить, что номер байта в виде byteN+=line.length() я пишу в каждую строку, а после сортировки разбираю. Проблема возникает при записи в файл. А пишу я следующим образом в этом же методе ниже:
String[] terms = line.split("#");
byteN = Long.parseLong(terms[0]);
System.out.println("byteN after sort: "+ byteN);
String lineBytes=line.substring(terms[0].length()+1, line.length());
byteN=byteN-line.length();
RandomAccessFile raf = new RandomAccessFile(file, "rwd");
raf.seek(byteN);
raf.writeBytes(lineBytes);
raf.close();
}
Запись работает через "ж.."утко неправильно, хотя я проверяю, что всё становится на свои позиции(банально выводя в консоль все данные), как было вычитано с файла. Почему при записи в файл получается какой-то каламбур?
Ответы (1 шт):
RandomAccessFile raf = new RandomAccessFile(file, "rw");
//читаем строку с позиции N
raf.seek(byteN);
raf.readLine();
//проверяем позицию курсора
byteN=raf.getFilePointer();
//позиционируем курсор на начало строки
byteN=(byteN-1)-(lineBytes.length()+1);
raf.seek(byteN);
//пишем строку
raf.writeBytes(lineBytes);
raf.close();