Java 删除包含特定字符串的文本行
我正在尝试从文件中删除文本行。到目前为止,我有这个,但它给了我一些问题。如果行上的初始文本之后没有任何内容,则该选项有效。但是,如果在文本文件中,我在Bart ie Bart Jones之后有任何内容,例如,它不会删除该行,它只会保留它。请帮忙Java 删除包含特定字符串的文本行,java,Java,我正在尝试从文件中删除文本行。到目前为止,我有这个,但它给了我一些问题。如果行上的初始文本之后没有任何内容,则该选项有效。但是,如果在文本文件中,我在Bart ie Bart Jones之后有任何内容,例如,它不会删除该行,它只会保留它。请帮忙 public void removeLineFromFile(String file, String lineToRemove) { try { File inFile = new File(file); i
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
as contains自身调用contains
和其他trimindexOf
- 如果不考虑大小写,您可能希望使用
与小写字母进行比较
索引进行比较的更多信息,请参见
if (!line.trim().equals(lineToRemove))
与
- 不需要修剪,因为您只想知道字符串是否在直线中
indexOf
生成更少的字节码,然后contains
as contains自身调用indexOf
和其他trim
- 如果不考虑大小写,您可能希望使用
与小写字母进行比较
有关与indexOf
vscontains
进行比较的更多信息,请参阅。您需要在此行中使用而不是等于,而是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更喜欢哪个建议。