[英]How to replace a line with a new line using Java
使用缓冲区读取器,我解析了整个文件。 如果找到Oranges:模式,我想用ApplesAndOranges替换它。
try (BufferedReader br = new BufferedReader(new FileReader(resourcesFilePath))) {
String line;
while ((line = br.readLine()) != null) {
if (line.startsWith("Oranges:")){
int startIndex = line.indexOf(":");
line = line.substring(startIndex + 2);
String updatedLine = "ApplesAndOranges";
updateLine(line, updatedLine);
我调用方法updateLine,并传递原始行以及更新后的行值。
private static void updateLine(String toUpdate, String updated) throws IOException {
BufferedReader file = new BufferedReader(new FileReader(resourcesFilePath));
PrintWriter writer = new PrintWriter(new File(resourcesFilePath+".out"), "UTF-8");
String line;
while ((line = file.readLine()) != null)
{
line = line.replace(toUpdate, updated);
writer.println(line);
}
file.close();
if (writer.checkError())
throw new IOException("Can't Write To File"+ resourcesFilePath);
writer.close();
}
要更新文件,我必须使用其他名称(resourcesFilePath +“。out”)保存它。 如果我使用原始文件名,则保存的版本将变为空白。
所以这是我的问题,如何在不丢失任何数据的情况下用原始文件中的任何值替换行。
为此,您需要使用正则表达式(RegExp),如下所示:
str = str.replaceAll(“ ^ Orange:(。*)”,“ OrangeAndApples:$ 1”);
这是一个示例,也许不是您想要的,但在这里,在第一个参数中,括号中的表达式称为捕获组。 找到的表达式将被第二个参数替换,$ 1将被捕获组的值替换。 在我们的示例中,行开始处的Orange:Hello将被OrangeAndApples:Hello代替。
在您的代码中,它意味着您每行只能创建一个文件...内联子方法可能会更好。
try (
BufferedReader br = new BufferedReader(new FileReader(resourcesFilePath));
BufferedWriter writer = Files.newBufferedWriter(outputFilePath, charset);
) {
String line;
while ((line = br.readLine()) != null) {
String repl = line.replaceAll("Orange:(.*)","OrangeAndApples:$1");
writer.writeln(repl);
}
}
覆盖原始结局中所有内容的最简单方法是读取所有内容-更改要更改的内容并关闭流。 然后再次打开文件,然后用所需的数据覆盖文件及其所有行。
您可以使用RandomAccessFile写入文件,并使用nio.Files读取文件中的字节。 在这种情况下,我将其作为字符串。
您也可以使用RandomAccessFile读取文件,但我认为这样做更容易。
import java.io.RandomAccessFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
public void replace(File file){
try {
RandomAccessFile raf = new RandomAccessFile(file, "rw");
Path p = Paths.get(file.toURI());
String line = new String(Files.readAllBytes(p));
if(line.startsWith("Oranges:")){
line.replaceAll("Oranges:", "ApplesandOranges:");
raf.writeUTF(line);
}
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.