如何在文件Java中直接访问两行的位置交换位置

时间:2019-03-06 19:14:53

标签: java file data-access

我需要交换文件中两行的位置,以直接访问它们。

文件中的所有行都具有相同的字节大小,我知道每行的位置,因为它们都具有相同的大小,但是我需要直接指向它们,而不需要遍历所有文件。

所以我需要知道如何将自己放置在那儿以及如何读取和删除它们,而我确实找不到我理解的解决方案。

谢谢。

示例: 我想交换第二行和第四行。

文件内容:

 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 :(得分:0)

纯粹是教育例子。不要在生产中使用类似的东西。请改用库。 无论如何,请遵循我的评论。

文件示例

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