我已经陷入困境一段时间了,我终于决定寻求帮助。所以我有一个小文本文件,用户想从中切换2行,用户输入这2行的索引,我必须切换它们。到目前为止,我的想法是使用带有2个正则表达式的replaceALL,但A:这可能不会切换它们,而是最终用另一个替换一个,留下一个重复,B:我不知道如何使用regex定位第n行;或者使用-Files.readAllLines(Paths.get(name)).get(index);以获得两条线路,但我仍在为实际的切换过程而挣扎。
您可以使用
Files.readAllLines
以列表形式获取所有行- 交换列表中的两个元素。例如
Collections.swap
- 将所有行写回以更新文件
如果你需要能够处理大文件,你可以
- 使用RandomAccessFile通过从文件的开头读取来查找所需行的开头/结尾
- 把这两行字读入缓冲区
- 把这两行写在适当的位置,但要互换
如果您正在处理一个大文件并需要节省内存,您可以这样做(尽管如果第二个交换行接近文件末尾,可能需要更长的时间):
File myFile = new File(somePath);
File outputFile = new File(someOtherPath);//this is where the new version will be stored
BufferedReader in = new BufferedReader(new FileReader(myFile));
PrintWriter out = new PrintWriter(outputFile);
String line;
String swapLine;//first line to swap
int index = -1;//so that the first line will have an index of 0
while((line = in.readLine()) != null){
index++;
if(index == firstIndex){//if this line is the first line to swap
swapLine = line;//store the first swap line for later
//Create a new reader. This one will read until it finds the second swap line.
BufferedReader in2 = new BufferedReader(new FileReader(myFile));
int index2 = -1;
while(index2 != secondIndex){
index2++;
line = in.readLine();
}
//The while loop will terminate once line is equal to the second swap line
}else if(index == secondIndex)//if this line is the second swap line{
line = swapLine;
//this way the PrintWriter will write the first swap line instead of the second
}
out.println(line);
}
当然,您可以通过编程删除myFile
,然后将outputFile
重命名为磁盘上myFile
的名称:
myFile.delete();
outputFile.renameTo(myFile);
我相信这是有效的,但我还没有测试过。