Java 如何从文件中删除指定的行?

Java 如何从文件中删除指定的行?,java,Java,我有一个包含一些数据的文件,我想从这个文件中删除一些包含特定子字符串的行 我的文件示例: {1:F21FIEGEGCXAXXX4781478239}{4:{177:1603150825}{451:0}} {1:F01FIEGEGCXAXXX4781478239} {2:O1030924160315RJHISARIAXXX83068856911603150825N} {4::20:PO/180797059/767 :23B:CRED :32A:160315USD1405,19 :50K:/2130

我有一个包含一些数据的文件,我想从这个文件中删除一些包含特定子字符串的行

我的文件示例:

{1:F21FIEGEGCXAXXX4781478239}{4:{177:1603150825}{451:0}}
{1:F01FIEGEGCXAXXX4781478239}
{2:O1030924160315RJHISARIAXXX83068856911603150825N}
{4::20:PO/180797059/767
:23B:CRED
:32A:160315USD1405,19
:50K:/213000010006082015619
M A A H
TABOUK 71411 PO BOX 000001
:53B:/152700
:57A:FIEGEGCXMIN
:59:/3829
ESAM ABDELALIM ABDELRAHMAN HABIB
EGYPT
:70:Family Expenses
:71A:SHA-}
{5:{MAC:00000000}{CHK:C04D5471B9E9}}{S:{SAC:}{COP:P}}
我想删除以
{451:0}}
结尾的每一行,比如第一行和最后一行

    try{
        Scanner scanner = new Scanner(new File("input.txt"));
        Writer writer = new PrintWriter(new File("output.txt"));
        while(scanner.hasNextLine()){
            String line = scanner.nextLine();
            if(!line.endsWith("{451:0}}") && !line.endsWith("{COP:P}}")){
                writer.write(line+System.getProperty("line.separator"));
            }
        }
        scanner.close();
        writer.flush();
        writer.close();
    }catch(Exception e){
        e.printStackTrace();
    }

如果输入文件不是很大。以下可能是解决方案的起点

Path in = Paths.get("in.txt");
Path out = Paths.get("out.txt");
Files.write(out, Files.lines(in, StandardCharsets.UTF_8)
        .filter(s -> !s.endsWith("{451:0}}") && !s.endsWith("{COP:P}}"))
        .collect(Collectors.toList()));
按照Klitos Kyriacou在评论中的建议进行编辑。对于大型文件,我们应该跳过创建临时列表

Stream<String> inStream = Files.lines(in, StandardCharsets.UTF_8)
        .filter(s -> !s.endsWith("{451:0}}") && !s.endsWith("{COP:P}}"));
Files.write(out, (Iterable<String>) inStream::iterator);
Stream-inStream=Files.lines(in,StandardCharsets.UTF_8)
.filter(s->!s.endsWith(“{451:0}”)和&!s.endsWith(“{COP:P}”);
写入(out,(Iterable)inStream::iterator);

您试过什么吗?请提供您所尝试的内容请参见这个问题,它给出了您所寻找的大部分内容,需要修改以仅支持行尾:可能重复@Andremoniy,这非常相似,但C#这里的问题是Java。对于小文件来说,这是一个很好的解决方案,但是为什么要通过创建一个完整的
列表来从
流创建所需的
Iterable
?您可以改为执行
文件。write(out,(…)::iterator)
-方法引用语法是创建
Iterable
接口实现的快捷方式,如中所示。有了这个,它也可以处理巨大的文件@克里托斯基里亚库:我根本没有想过。我把你的建议加到了答案上。谢谢你的提示。