繁体   English   中英

如何使用Java用新行替换新行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM