读取并删除文件中的X行

时间:2014-09-27 17:05:15

标签: java file

所以我有这个文件:

randomline
ernegvggvdr
dsvdfssvdsv
dfsfvfvs
svdfsdfdfs
dfsfvfv
dsvvsvvfggd

这种情况持续了成千上万行。事实上,它大约有45,000行。

我想阅读前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行。

2 个答案:

答案 0 :(得分:0)

如果这是你的整个问题,那么Java并不是最好的方法 - 你可以使用头部和尾部等UNIX实用程序轻松完成。

What's the opposite of head? I want all but the first N lines of a file

要在Java中逐行读取和写入文本文件,您需要了解BufferedReaderPrintWriter等。

答案 1 :(得分:0)

将文件视为一维字节数组。你不能简单地从头开始删除一些东西。相反,您需要通过复制数据来填补空白。此外,文件本身是完全非结构化的。它不“知道”它有文本行。纯粹是惯例,在每个\n字符之后,我们说新行开始。

如果您想转换此文件:

the first line
the second line
the third line
the fourth line
the fifth line

实际上看起来像

{'t', 'h', 'e', ' ', 'f', 'i', 'r', 's', 't', ' ', 'l', 'i', 'n', 'e', '\n', 't', 'h', 'e', ' ', 's', 'e', 'c', 'o', 'n', 'd', ' ', 'l', 'i', 'n', 'e', '\n', 't', 'h', 'e', ' ', 't', 'h', 'i', 'r', 'd', ' ', 'l', 'i', 'n', 'e', '\n', 't', 'h', 'e', ' ', 'f', 'o', 'u', 'r', 't', 'h', ' ', 'l', 'i', 'n', 'e', '\n', 't', 'h', 'e', ' ', 'f', 'i', 'f', 't', 'h', ' ', 'l', 'i', 'n', 'e', '\n'}

进入该文件:

the third line
the fourth line
the fifth line

实际上看起来像

{'t', 'h', 'e', ' ', 't', 'h', 'i', 'r', 'd', ' ', 'l', 'i', 'n', 'e', '\n', 't', 'h', 'e', ' ', 'f', 'o', 'u', 'r', 't', 'h', ' ', 'l', 'i', 'n', 'e', '\n', 't', 'h', 'e', ' ', 'f', 'i', 'f', 't', 'h', ' ', 'l', 'i', 'n', 'e', '\n'}

您需要确定要跳过哪个字节(在本例中为第31个),然后将所有剩余字节按该数量向开头移位。这可以使用内存映射文件在Java中高效完成(请参阅FileChannel),但这不是一项简单的任务。

相反,您应该将文件作为流处理并将其写入另一个文件。然后,最终,您可以重命名新文件以覆盖旧文件。如果你有足够的磁盘空间(你拥有它,不是吗?),这是最简单的方法。

  • 打开输入文件并为其创建BufferedReader
  • 打开输出文件。
  • 对输入中的前n行重复:
    • 什么都不做。
  • 对输入中的所有剩余行重复:
    • 将该行写入输出文件。
  • 关闭这两个文件。