读取并删除文件中的 X 行
读取并删除文件中的 X 行
我有一个文件,大约有45,000行,内容如下:
randomline ernegvggvdr dsvdfssvdsv dfsfvfvs svdfsdfdfs dfsfvfv dsvvsvvfggd
我想读取前100行并删除它们。我知道以下代码可以读取文件的全部内容:
Files.readAllBytes(new File(new File("").getAbsolutePath() + "lines.txt").toPath());
我还知道以下代码可以删除整个文件:
new File(new File("").getAbsolutePath() + "line.txt").delete();
然后,可以使用以下代码重新创建一个空文件:
new File(new File("").getAbsolutePath() + "line.txt").createNewFile();
但是,所有这些操作都是针对整个文件而不是前X行。
问题:从文件中读取并删除X行的原因是什么?该问题的解决方法是什么?
在Java中,如果你需要从文件中读取并删除X行的内容,可以使用UNIX实用工具(如head和tail)来轻松实现。但是,如果你想在Java中逐行读取和写入文本文件,你需要学习使用BufferedReader、PrintWriter等。
问题的原因是,Java中没有直接提供一种简单的方法来读取文件的特定行数,并且删除这些行。因此,需要使用一些其他的方法来实现这个功能。UNIX实用工具提供了一种简单的方法来读取文件的特定行数,但这对于需要在Java中进行其他操作的开发人员来说可能不是最佳选择。
为了解决这个问题,可以使用Java的输入/输出流和缓冲区类来逐行读取和写入文本文件。BufferedReader类可以用来读取文件的内容,并将其保存到缓冲区中。通过使用读取到的内容,可以找到需要删除的行,并将其从缓冲区中删除。然后,使用PrintWriter类将缓冲区中剩余的内容写回文件中,从而实现从文件中读取并删除X行的功能。
在Java中,如果需要从文件中读取并删除X行的内容,可以使用UNIX实用工具(如head和tail)来轻松实现。但是,如果你想在Java中逐行读取和写入文本文件,需要学习使用BufferedReader、PrintWriter等的方法。问题的原因是Java中没有直接提供一种简单的方法来实现这个功能。解决这个问题的方法是使用Java的输入/输出流和缓冲区类来逐行读取和写入文本文件,并通过使用缓冲区类来删除需要删除的行,最后将剩余的内容写回文件中。
文件是一个一维字节数组,无法直接删除开头的内容。相反,需要通过复制数据来填充空白部分。此外,文件本身是完全无结构的。它并不知道它有多少行文本。我们约定每个换行符\n
之后,表示开始了一行新的文本。
如果想要将以下文件内容:
the first line the second line the third line the fourth line the fifth line
转换为以下文件内容:
the third line the fourth line the fifth line
你需要确定要跳过的字节数(在本例中是第31个字节),然后将其后的所有字节向前移动相应的字节数。在Java中,可以使用内存映射文件来高效完成此操作(参见FileChannel
),但这并不是一项简单的任务。
相反,你可以将文件视为流并将其写入另一个文件。然后,最终可以将新文件重命名为旧文件以覆盖它。如果你有足够的磁盘空间(你有的,对吧?),这是最简单的方法。
以下是解决该问题的一种方法:
- 打开输入文件,并为其创建一个BufferedReader
。
- 打开输出文件。
- 对于输入文件的前n行,重复以下步骤:
- 什么都不做。
- 对于输入文件的剩余所有行,重复以下步骤:
- 将该行写入输出文件。
- 关闭两个文件。
这样就可以实现删除文件中的前n行的操作。