Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在读取行后逐个删除文件中的所有行?_Java - Fatal编程技术网

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

Java 如何在读取行后逐个删除文件中的所有行?,java,Java,我正在编写一个java程序,它执行以下操作: 从文件中读入一行 根据这条线做一些动作 删除该行或将其替换为,如果2不成功,则将其写入新文件 继续到文件中所有行的下一行,而不是删除任意行 目前我有: try (BufferedReader br = new BufferedReader(new FileReader(inputFile))) { String line; while ((line = br.readLi

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

从文件中读入一行 根据这条线做一些动作 删除该行或将其替换为,如果2不成功,则将其写入新文件 继续到文件中所有行的下一行,而不是删除任意行 目前我有:

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,因为它不能写,但是我应该使用什么类呢?此外,阅读顺序也不重要


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

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

如果一行处理成功,它将从原始文件中删除 如果一行未成功处理,它将被添加到新文件中,并保留在原始文件中。 很容易理解为什么在这个过程结束时,原始文件与新文件相同。您所需要做的就是将算法执行到底,然后将新文件复制到原始文件的位置


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

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

如果一行处理成功,它将从原始文件中删除 如果一行未成功处理,它将被添加到新文件中,并保留在原始文件中。 很容易理解为什么在这个过程结束时,原始文件与新文件相同。您所需要做的就是将算法执行到底,然后将新文件复制到原始文件的位置


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

您不能同时读取和写入文件。您需要在内存或文件系统中创建一个副本,然后写入另一个文件。您无法真正删除该行。删除一行意味着物理上移动所有剩余的文本,而您确实不想这样做。您不能同时读取和写入文件。您需要在内存或文件系统中创建一个副本,然后写入另一个文件。您无法真正删除该行。删除一行意味着实际移动所有剩余的文本,而您确实不想这样做。如果担心过程中途中断,并且您无法再次处理这些行,则应使用其他跟踪进度的方法。如果不是担心的话,这正是正确的答案。这是一个非常好的观点,而且我没有考虑到这两个文件最终是相同的。我编辑了这个问题以便更清楚地说明这一点@安德烈亚斯对我的担忧是正确的——关键是要防止这个过程中途夭折through@Musher您的进程是否希望大部分时间都能运行到完成,但偶尔会崩溃(比如说,不到百分之一次运行)?这意味着一个长时间运行的进程会定期轮询目录中的文件。理想情况下,it崩溃的唯一时间是在系统重新启动时。最好的解决方案是使您的业务逻辑。这样,您就可以重新处理部分处理的文件。如果你做不到,那么
每一行都是独立处理和提交的。如果是RDBMS,您需要更安全的状态跟踪来跳过以前处理的行,例如,一个包含最后处理的行号的小文件,为每个完成的行写入和刷新。使用此选项会降低性能,因为刷新到磁盘的成本很高。如果担心进程中途中断,并且您无法再次处理这些行,则应使用其他跟踪进度的方法。如果不是担心的话,这正是正确的答案。这是一个非常好的观点,而且我没有考虑到这两个文件最终是相同的。我编辑了这个问题以便更清楚地说明这一点@安德烈亚斯对我的担忧是正确的——关键是要防止这个过程中途夭折through@Musher您的进程是否希望大部分时间都能运行到完成,但偶尔会崩溃(比如说,不到百分之一次运行)?这意味着一个长时间运行的进程会定期轮询目录中的文件。理想情况下,it崩溃的唯一时间是在系统重新启动时。最好的解决方案是使您的业务逻辑。这样,您就可以重新处理部分处理的文件。如果您不能做到这一点,并且如果使用RDBMS,每一行都是独立处理和提交的,那么您需要一个更安全的状态跟踪来跳过以前处理过的行,例如,一个包含最后处理的行号的小文件,为每个完成的行写入和刷新。使用这种选项会降低性能,因为刷新到磁盘的成本很高。