所以我有这个文件:
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行。
答案 0 :(得分:0)
如果这是你的整个问题,那么Java并不是最好的方法 - 你可以使用头部和尾部等UNIX实用程序轻松完成。
What's the opposite of head? I want all but the first N lines of a file
要在Java中逐行读取和写入文本文件,您需要了解BufferedReader
,PrintWriter
等。
答案 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
。