Как прочитать и перезаписать строку в большом файле?

Создал файл и читаю его с помощью 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 шт):

Автор решения: Vitaliy M.V.
    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();
→ Ссылка