Как поменять местами две строки в файле Java с прямым доступом к строкам - PullRequest
0 голосов
/ 06 марта 2019

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

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

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

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

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

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

 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 Ответ

0 голосов
/ 06 марта 2019

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

Пример файла

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);
}
...