如何使用Java用新行替换行

时间:2016-01-17 23:59:13

标签: java bufferedreader filewriter

使用Buffer reader我解析整个文件。如果找到Oranges:pattern,我想用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")保存它。如果我使用原始文件名,则保存的版本将变为空白 所以这是我的问题,如何在不丢失任何数据的情况下用原始文件中的任何值替换一行。

3 个答案:

答案 0 :(得分:0)

为此,您需要使用正则表达式(RegExp),如下所示:

str = str.replaceAll(" ^ Orange:(。*)"," OrangeAndApples:$ 1");

这是一个例子,也许它并不是你想要的,但在这里,在第一个参数中,parentesis中的表达被称为捕获组。找到的表达式将替换为第二个参数,$ 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);
    }
}

答案 1 :(得分:0)

在原始决赛中写出所有内容的最简单方法是阅读所有内容 - 更改您想要更改的内容并关闭流。然后再次打开文件,然后用你想要的数据覆盖文件及其所有行。

答案 2 :(得分:0)

您可以使用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();
    }
    }