【问题标题】:Remove line from big txtfile in Java从Java中的大文本文件中删除行
【发布时间】:2009-09-02 13:12:59
【问题描述】:

有人知道如何从文本文件中删除一行吗?

我正在寻找其他内容,而不是逐行读写并跳过您要删除的行。

例如:我的文件有 1346 行,我想删除第 520 行。

【问题讨论】:

  • 你知道最后一行的内容吗?
  • 你知道线的位置吗?或者你知道这条线是什么样子的吗?
  • 我可以让我的程序计算线的位置,是的。
  • 我正在查看 RandomAccessFile 以合并其中的 2 个,但我发现了这个 stackoverflow.com/questions/934458/… ,所以我不知道...

标签: java text io line


【解决方案1】:

文本文件不支持零成本重组。它只是一个连续的字节序列。如果您想从文件中间删除一些字节(并且暗示将所有后续字节向上移动以覆盖已删除的字节),您必须复制并重新写入所有这些后续字节。

您有几个选择。将整个文件读入内存,进行删除,然后将文件写出。 (希望您在成功完成写入后在原始文件之上重命名一个临时文件)或者做一些花哨的步法,只需从源文件中读取缓冲区的数据并对其进行一些工作。

【讨论】:

  • 我打算做同样的评论:无论是什么语言,删除文件中间的字节都没有魔法(至少在我知道的大多数操作系统中)。所以我只是对你的回答 +1。
【解决方案2】:

解决方案是否需要用 Java 编写? UNIX 命令 sedgrep 就是为此目的而设计的,它们的性能可能会更好。如果您运行的是 Windows,则可以通过 Cygwin 访问这些工具,或者那里可能有本地端口。

【讨论】:

  • 我同意,但我怀疑这个问题应该有一个“家庭作业”标签,因此它必须留在 java 中。 (注意数字 52O 中的字母“O”,而不是 520。
【解决方案3】:

是的。罗布是对的。 试试这个

sed -e '520d' <yourfile>

将输出重定向到新文件

这里520是你要删除的行号

【讨论】:

    【解决方案4】:

    您可以读入整个文件,进行正则表达式替换(假设您知道完全匹配等),然后将文件写回。

    我个人不确定这个答案有多大价值:)

    【讨论】:

    • 就像我解释的那样。我不想读书和写字。
    【解决方案5】:

    好吧,如果你知道长度(或最后一行的内容):

    long lastLineLength = lastLine.length();
    RandomAccessFile raf = new RandomAccessFile("RandFile.txt", "rw");
    long length = raf.length();
    raf.setLength(length - lastLineLength );
    raf.close();
    

    【讨论】:

    • 这是我想要的更多,但这只是最后一行
    • 抱歉,不太明白您的评论
    • @stefita 你只删除最后一行。这不是问题,我猜他想删除任意一行。
    • 是的,作者更改了描述。初稿是关于最后一行的。
    猜你喜欢
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2015-12-22
    • 2011-01-05
    • 2021-10-26
    • 2016-01-24
    相关资源
    最近更新 更多