在Java中,我有一个包含以下行的文件:
abc
cbd
CFG
...
如果任何行匹配字符串,我想从文件中删除CFG,这可能是'cfg','Cfg'或其他不区分大小写的变体。
如果我将文件读入Set,我该如何实现?通过将文件读入List中来执行此操作似乎更为可行。
答案 0 :(得分:1)
这样的东西?
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();
}
});
}
唯一不可思议的是需要两个trys,因为不允许从lambda中抛出异常。
答案 1 :(得分:1)
以下是" lambda版本"所需的代码。感谢@Sam关于重新提升任何被抑制的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");
}
}
最后,为了以防万一,与lambda兼容的非lambda解决方案:
Path in_file = Paths.get("infile");
Path out_file = Paths.get("outfile");
try (BufferReader reader = Files.newBufferedReader(in_file);
PrintWriter pw = new PrintWriter(out_file.toFile())) {
String line;
while((line = reader.readline()) != null) {
if (!line.equalsIgnoreCase("cfg")) {
pw.println(line);
}
}
if (pw.checkError()) {
throw new IOException("Exception(s) occurred in PrintWriter");
}
}
答案 2 :(得分:0)
您可以在列表中搜索字符串,然后使用位置将其删除。
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;
}
答案 3 :(得分:-1)
我认为TreeSet正是您所寻找的,请看一下这个链接: