【问题标题】:how to insert a text into specific line in file using java? [duplicate]如何使用java将文本插入文件中的特定行? [复制]
【发布时间】:2021-03-07 11:19:02
【问题描述】:

场景:我想在文件中的特定行追加文本。

面临的问题:附加的文本总是添加到最后一行。

文本文件中的示例:

之前

line 1
line 2
line 3

之后(我希望成为)

line 1
line 2
line 2.1
line 3

实际情况

line 1
line 2
line 3
line 2.1

下面是我的代码

    public static void main(String args[]) throws IOException {
    try (FileWriter f = new FileWriter("Test.txt", true); 
            BufferedWriter b = new BufferedWriter(f); 
            PrintWriter p = new PrintWriter(b);) {
        File files = new File ("Test.txt");
        Scanner scanner = new Scanner(files);
        
        while(scanner.hasNext()) {
            String line = scanner.nextLine();
            if(line.contains("line 2")) {
                p.println("line 2.1"); // I wish that "line 2.1" will be printed after the line of "line 2", but it don't
            }
        
    }
}

}

有什么方法可以直接在文件中实现这个功能?谁能给我一个例子? 非常感谢!

【问题讨论】:

  • 也许我在这里遗漏了一些东西,但是您的示例输入中的所有行都不包含子字符串“see”。
  • 你是对的。抱歉,我已经编辑过了
  • 你能把文件读成字符串吗?
  • 是的,文件中的文本在下面的代码中逐行读入名为“line”的字符串中
  • 我的意思是,它是否足够小以适合内存?

标签: java file


【解决方案1】:

从您的描述看来,您正在写入现有文件并希望增强其内容,而不是从头开始创建它。

我不确定是否可以直接将新行写入该文件的特定位置,但作为“快速解决方法”,您可以简单地将旧文件复制到 tmp 文件,并在此复制过程中过程安排你喜欢的线条。在该过程结束时,您将删除原始文件并将其替换为 tmp 文件。

看起来你只是用你的新行增强了前一个。

实际上,以下示例在没有临时文件的情况下也可以通过直接替换原始文件来工作:

在 Java 7+ 中,您可以使用 Files 和 Path 类,如下所示:

List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
lines.add(position, extraLine);
Files.write(path, lines, StandardCharsets.UTF_8);

完整的示例可能如下所示:

enum InsertPosition {
    BEFORE, AFTER;
}

public static void main(String[] args) throws IOException {
    Path path = Paths.get("C:\\Users\\foo\\Downloads\\Test.txt");
    List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);

    int position = findPosition(lines, "see", InsertPosition.AFTER);
    String extraLine = "so";

    lines.add(position, extraLine); // Note -1 can be returned from "findPosition" which will lead to an exception here, but you can simply suround it with an additional if
    Files.write(path, lines, StandardCharsets.UTF_8);
}

private static int findPosition(List<String> lines, String lineToLookFor, InsertPosition position) {

    for (int i = 0; i < lines.size(); i++) {
        if (lineToLookFor.equals(lines.get(i))) {
            if (position == InsertPosition.BEFORE) {
                return i;
            } else if (position == InsertPosition.AFTER) {
                return i + 1;
            }
        }
    }

    return -1;
}

当原始文件如下所示:

1
see
3

输出将是:

1
see
so
3

使用此解决方案请注意,它可能会消耗大量内存,因为文件的全部内容将在处理时缓冲在内存中。这意味着它可以在小文件上被忽略,但在大文件上可能表现不佳。

如果您还想要并且需要处理更大的文件,您可以实现一种更像流的方法,其中只有几行大文件将被缓冲在内存中。

【讨论】:

  • 谢谢!对我帮助很大!!
  • 欢迎您,很高兴听到 :) 如果可能的话,当您也可以正式接受它时,将不胜感激。如果您还有其他问题,请在此处发表评论。
猜你喜欢
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多