Как поменять местами две строки в файле Java, получая прямой доступ к строкам

#java #file #data-access

#java #файл #доступ к данным

Вопрос:

Мне нужно поменять местами позиции двух строк в файле, обращающемся непосредственно к ним.

Все строки в моем файле имеют одинаковый размер в байтах, я знаю, где находится каждая строка, поскольку все они одинакового размера, но мне нужно указать на них напрямую, не просматривая весь файл.

Итак, мне нужно знать, как расположиться там и как их прочитать и удалить, и я действительно не мог найти решение, которое я понимаю.

Заранее спасибо.

Пример: Я хочу поменять местами вторую и четвертую строки.

Содержимое файла:

  1;first line                         ; 1
 2;second line                        ; 1
 3;third                              ; 2
 4;fourth                             ; 2
 5;fifth                              ; 2
  

Как это должно выглядеть:

  1;first line                         ; 1
 4;fourth                             ; 2   
 3;third                              ; 2
 2;second line                        ; 1
 5;fifth                              ; 2
  

Комментарии:

1. Пожалуйста, приведите пример.

2. Я сделал, извините, я не был более конкретен в своей проблеме.

3. Вы смотрели на LineNumberReader ?

4. Если вы знаете размер каждой строки, есть много способов сделать это. Можете ли вы показать нам, что вы уже пробовали?

Ответ №1:

Чисто образовательный пример. Не используйте что-то подобное в производстве. Вместо этого используйте библиотеку. В любом случае, следите за моими комментариями.

Пример файла

 ciaocio=1
edoardo=2
lolloee=3
  

Цель

 ciaocio=1
lolloee=3
edoardo=2
  

 final int lineSeparatorLength = System.getProperty("line.separator").getBytes().length;

// 9 = line length in bytes without separator
final int lineLength = 9   lineSeparatorLength;

try (final RandomAccessFile raf = new RandomAccessFile(file, "rw")) {
    // Position the cursor at the beginning of the first line to swap
    raf.seek(lineLength);

    // Read the first line to swap
    final byte[] firstLine = new byte[lineLength];
    raf.read(firstLine);

    // Position the cursor at the beginning of the second line
    raf.seek(lineLength * 2);

    // Read second line
    final byte[] secondLine = new byte[lineLength];
    raf.read(secondLine);

    // Move the cursor back to the first line
    // and override with the second line
    raf.seek(lineLength);
    raf.write(secondLine);

    // Move the cursor to the second line
    // and override with the first
    raf.seek(lineLength * 2);
    raf.write(firstLine);
}
  

Комментарии:

1. Спасибо!! Это именно то, что я искал, и его легко понять