如何在读取行后逐个删除文件中的所有行?

时间:2016-04-27 14:23:41

标签: java

我正在编写一个执行以下操作的java程序:

  1. 从文件中读取一行
  2. 基于该行的某些操作
  3. 删除该行(或将其替换为""),如果2不成功,则将其写入新文件
  4. 继续前往文件中所有行的下一行(而不是删除任意行)
  5. 目前我有:

    try (BufferedReader br = new BufferedReader(new FileReader(inputFile))) {
                String line;                
                while ((line = br.readLine()) != null) {
                    try {
                        if (!do_stuff(line)){ //do_stuff returns bool based on success
                            write_non_success(line);
                         }
                    } catch (Exception e) {
                        e.printStackTrace(); //eat the exception for now, do something in the future
                }
            }
    

    显然我不需要为此使用BufferedReader,因为它无法写入,但我应该使用哪个类?此外,阅读顺序并不重要

    这与this question不同,因为我想删除所有行,而不是其他OP想要的任意行号,如果可能的话,我想避免在每一行之后写入临时文件,因为我的文件大约是100万行

1 个答案:

答案 0 :(得分:4)

如果您根据所描述的算法执行所有操作,原始文件中保留的内容将与步骤3中“新文件”的内容相同:

  • 如果成功处理了一行,则会从原始文件中删除该行
  • 如果未成功处理某行,则会将其添加到新文件中,并且该文件也会保留在原始文件中。

很容易理解为什么在此过程结束时原始文件与“新文件”相同。您需要做的就是将算法执行到最后,然后复制新文件代替原始文件。

如果你担心这个过程会在中间发生崩溃,那么情况会变得非常不同:现在你必须在处理完每一行后写出原始文件的当前状态,而不是在你写完之前写下原文。确保它将处于一致的状态。您可以通过将所有行读入列表,从列表中删除第一行,将整个列表的内容写入临时文件,然后将其复制到原始位置来实现。显然,这是非常昂贵的,所以不应该在紧密循环中尝试。但是,这种方法可确保原始文件不会处于不一致状态,这在您希望避免多次执行相同工作时非常重要。