Java 删除包含特定字符串的文本行

Java 删除包含特定字符串的文本行,java,Java,我正在尝试从文件中删除文本行。到目前为止,我有这个,但它给了我一些问题。如果行上的初始文本之后没有任何内容,则该选项有效。但是,如果在文本文件中,我在Bart ie Bart Jones之后有任何内容,例如,它不会删除该行,它只会保留它。请帮忙 public void removeLineFromFile(String file, String lineToRemove) { try { File inFile = new File(file); i

我正在尝试从文件中删除文本行。到目前为止,我有这个,但它给了我一些问题。如果行上的初始文本之后没有任何内容,则该选项有效。但是,如果在文本文件中,我在Bart ie Bart Jones之后有任何内容,例如,它不会删除该行,它只会保留它。请帮忙

public void removeLineFromFile(String file, String lineToRemove) {

    try {

        File inFile = new File(file);

        if (!inFile.isFile()) {
            System.out.println("Parameter is not an existing file");
            return;
        }

        //Construct the new file that will later be renamed to the original filename.
        File tempFile = new File(inFile.getAbsolutePath() + ".tmp");

        BufferedReader br = new BufferedReader(new FileReader(file));
        PrintWriter pw = new PrintWriter(new FileWriter(tempFile));

        String line = null;

        //Read from the original file and write to the new
        //unless content matches data to be removed.
        while ((line = br.readLine()) != null) {

            if (!line.trim().equals(lineToRemove)) {

                pw.println(line);
                pw.flush();
            }
        }
        pw.close();
        br.close();

        //Delete the original file
        if (!inFile.delete()) {
            System.out.println("Could not delete file");
            return;
        }

        //Rename the new file to the filename the original file had.
        if (!tempFile.renameTo(inFile))
            System.out.println("Could not rename file");

    }
    catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }
    catch (IOException ex) {
        ex.printStackTrace();
    }
}

public static void main(String[] args) {
    FileUtil util = new FileUtil();
    util.removeLineFromFile("booklist.txt", "bart");
}
} `而不是
。equals(lineToRemove)
使用
。contains(lineToRemove)
而不是
。equals(lineToRemove)
使用
。contains(lineToRemove)
只需更改即可

if (!line.trim().equals(lineToRemove))

  • 不需要修剪,因为您只想知道字符串是否在直线中
  • indexOf
    生成更少的字节码,然后
    contains
    as contains自身调用
    indexOf
    和其他trim
  • 如果不考虑大小写,您可能希望使用
    与小写字母进行比较
有关与
索引进行比较的更多信息,请参见

if (!line.trim().equals(lineToRemove))

  • 不需要修剪,因为您只想知道字符串是否在直线中
  • indexOf
    生成更少的字节码,然后
    contains
    as contains自身调用
    indexOf
    和其他trim
  • 如果不考虑大小写,您可能希望使用
    与小写字母进行比较

有关与
indexOf
vs
contains
进行比较的更多信息,请参阅。您需要在此行中使用
而不是
等于
,而是
contains

if (!line.trim().equals(lineToRemove)) {
像这样:

if (!line.contains(lineToRemove)) {

您不需要在此行中使用
等于
,而是使用
包含

if (!line.trim().equals(lineToRemove)) {
像这样:

if (!line.contains(lineToRemove)) {

这与您在文件中搜索字符串的方式有关。目标是删除一行“包含”字符串,而不是“等于”字符串。在循环中更改if语句应该可以做到这一点

 if (!line.trim().toLowerCase().contains(lineToRemove.toLowerCase())) {

            pw.println(line);
            pw.flush();
        }

注意,我还添加了一个对toLowerCase()的调用,以防搜索字符串和行内容在不同的情况下,您可能也想删除它们。如果不是这样,您可以安全地删除这些调用。

这与您在文件中搜索字符串的方式有关。目标是删除一行“包含”字符串,而不是“等于”字符串。在循环中更改if语句应该可以做到这一点

 if (!line.trim().toLowerCase().contains(lineToRemove.toLowerCase())) {

            pw.println(line);
            pw.flush();
        }

注意,我还添加了一个对toLowerCase()的调用,以防搜索字符串和行内容在不同的情况下,您可能也想删除它们。如果不是这样,您可以安全地删除这些调用。

可读性胜过效率,但对性能最敏感的情况除外。我会使用String#contains,因为与indexOf相比,它使意图更加清晰。它比
indexOf(lineToRemove)>-1
更短,可读性更强。这是过早的优化,甚至是微观优化。@Jean-FrançoisSavard你链接到了一个C#问题。顺便说一句,这是你的观点。这种做法始终是争论的基础。。。在我看来,直接调用该方法比调用将调用另一个方法的方法更符合逻辑。与-1相比,imo的可编辑性不低。至于链接,是的,我意识到,我删除了链接。不过,如果你愿意的话,你可以在谷歌上搜索java。让我们看看OP更喜欢哪个建议。可读性胜过效率,除了在性能最敏感的情况下。我会使用String#contains,因为与indexOf相比,它使意图更加清晰。它比
indexOf(lineToRemove)>-1
更短,可读性更强。这是过早的优化,甚至是微观优化。@Jean-FrançoisSavard你链接到了一个C#问题。顺便说一句,这是你的观点。这种做法始终是争论的基础。。。在我看来,直接调用该方法比调用将调用另一个方法的方法更符合逻辑。与-1相比,imo的可编辑性不低。至于链接,是的,我意识到,我删除了链接。不过,如果你愿意的话,你可以在谷歌上搜索java。让我们看看OP更喜欢哪个建议。