【问题标题】:Read And Delete X Lines In File读取和删除文件中的 X 行
【发布时间】:2014-09-27 17:05:15
【问题描述】:

所以我有这个文件:

randomline
ernegvggvdr
dsvdfssvdsv
dfsfvfvs
svdfsdfdfs
dfsfvfv
dsvvsvvfggd

这持续了成千上万行。实际上,它大约是 45000 行。

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

【问题讨论】:

  • 文件是连续的。您不能只删除文件开头的行。您可以做的是 1. 逐行读取文件。 2. 对前 100 行读取不做任何事情。 3. 将剩余的行写入另一个文件。 4.删除原文件。 5.将创建的文件重命名为原始名称。阅读 Java IO 教程:docs.oracle.com/javase/tutorial/essential/io/charstreams.html
  • new File("").getAbsolutePath() + "line.txt" ... 很有趣,并不是因为您忘记了文件分隔符。请改用new File("line.txt").getAbsolutePath()
  • @JarrodRoberson “重复”问题是关于 C# 的,没有公认的答案。 (而且它的两个答案并没有真正的帮助,恕我直言。)所以我不确定这是否会回答 OP 的问题。
  • 我显然不小心粘贴了错误的链接。

标签: java file


【解决方案1】:

将文件视为一维字节数组。您不能简单地从头开始删除某些内容。相反,您需要通过复制数据来填补空白。此外,文件本身是完全非结构化的。它不“知道”它有文本行。在每个 \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 行重复:
    • 什么都不做。
  • 对输入中的所有剩余行重复:
    • 将该行写入输出文件。
  • 关闭这两个文件。

【讨论】:

    【解决方案2】:

    如果这是您的全部问题,Java 不是最好的方法 - 您可以使用 UNIX 实用程序(如 head 和 tail)轻松完成此操作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2022-07-21
      • 1970-01-01
      相关资源
      最近更新 更多