#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. Спасибо!! Это именно то, что я искал, и его легко понять