Java 如何查找和删除不区分大小写匹配的字符串?

Java 如何查找和删除不区分大小写匹配的字符串?,java,Java,在Java中,我有一个文件包含如下行: abc cbd CFG ... 如果任何一行与字符串匹配,我想从文件中删除CFG,该字符串可以是'CFG','CFG',或其他不区分大小写的变体 如果我将文件读入一个集合,我如何实现这一点?通过将文件读入列表来实现这一点似乎更为可行。类似这样的事情 try (BufferedReader bf = new BufferedReader(new FileReader(new File("PATH TO FILE"))); BufferedWrit

在Java中,我有一个文件包含如下行:

abc
cbd
CFG
...
如果任何一行与字符串匹配,我想从文件中删除CFG,该字符串可以是'CFG','CFG',或其他不区分大小写的变体

如果我将文件读入一个集合,我如何实现这一点?通过将文件读入列表来实现这一点似乎更为可行。

类似这样的事情

try (BufferedReader bf = new BufferedReader(new FileReader(new File("PATH TO FILE")));
     BufferedWriter bw = new bw(new FileWriter(new File("PATH TO NEW FILE")))) {
  bf.lines()
      .filter(line -> !line.equalsIgnoreCase("cfg"))
      .forEach(line -> {
        try {
          bw.write(line);
        } catch (IOException e) {
          e.printStackTrace();
        }
  });
}
唯一糟糕的是需要两次尝试,因为不允许从lambdas抛出异常。

以下是所需代码的“lambda版本”。感谢关于重新引发任何被抑制的PrintWriter IOException的要点

Path in_file = Paths.get("infile");
Path out_file = Paths.get("outfile");
try (PrintWriter pw = new PrintWriter(out_file.toFile())) {
    Files.lines(in_file)
         .filter(line -> !line.equalsIgnoreCase("cfg"))
         .forEach(pw::println);
    if (pw.checkError()) {
        throw new IOException("Exception(s) occurred in PrintWriter");
    }
}
如果需要就地修改文件,那么在读取文件的同时写入文件会有点困难。你可以先把它读入内存

Path path = new Path("filename");
List<String> lines = Files.lines(path)
                          .filter(line -> !line.equalsIgnoreCase("cfg"))
                          .collect(Collectors.toList());

try(PrintWriter pw = new PrintWriter(path.toFile())) {
    lines.forEach(pw::println);
    if (pw.checkError()) {
        throw new IOException("Exception(s) occurred in PrintWriter");
    }
}

您可以在列表中搜索字符串,并使用位置删除该字符串

public List<String> removeItemInListIgnoreCase(List<String> items, String itemToRemove){
        if(CollectionUtils.isEmpty(items)) 
        return new ArrayList<String>();
        for(int i=0; i<items.size();i++) {
            if(items.get(i).equalsIgnoreCase(itemToRemove)) {
                items.remove(i);
            }
        }
        return items;
    }
public List removieteminListIgnoreCase(列表项、字符串项删除){
if(收款项为空(项目))
返回新的ArrayList();

对于(int i=0;iYou可以执行类似大写的操作,将字符串插入到集合中。
string.equalsIgnoreCase(string str)
然后当您打印出来时,您丢失了所有原始大小写,这不是我需要的。A
PrintWriter
为您抑制异常。请参阅我的答案。
BufferedReader#lines()
从行流中删除换行符。您需要使用
bw.write(line.newline();
.Whoops!
bw.write(line);bw.newline()将其添加回
你不能链接
BufferedWriter
方法。很好!我不知道!@Sam-Ya,handy那
PrintWriter
。现在如果他们只有
.collect(toFile(path))
收集器,这可能是一个“一行程序”!虽然我刚刚读了更多关于它的内容,但它确实会吞噬异常。我想如果它抛出一个RuntimeException供生产使用,我会更高兴,所以如果它有点错误,我至少会在日志中结束一些东西。@Sam-你可以调用
if(pw.checkError()){throw new IOException(“流有错误”);}
try{}
块的末尾。也许没有那么多信息,但实际上你只关心出现了问题,以及问题大部分发生在哪里。是的,我意识到这将是一种折衷:)
public List<String> removeItemInListIgnoreCase(List<String> items, String itemToRemove){
        if(CollectionUtils.isEmpty(items)) 
        return new ArrayList<String>();
        for(int i=0; i<items.size();i++) {
            if(items.get(i).equalsIgnoreCase(itemToRemove)) {
                items.remove(i);
            }
        }
        return items;
    }