文件看作字节的一维数组。你不能简单地从头开始删除一些东西。相反,您需要通过复制数据来弥补差距。另外,文件本身是完全非结构化的。它不会“知道”它有文本行。纯粹是约定每个\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行:
- 重复在输入的全部剩余线路:
- 关闭这两个文件。
文件是连续的。您不能只删除文件开头的行。你可以做的是1.逐行读取文件。 2.对前100个读取行不做任何操作。 3.将剩余的行写入另一个文件。 4.删除原始文件。 5.将创建的文件重命名为原始名称。阅读Java IO教程:http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html – 2014-09-27 17:10:45
'new File(“”)。getAbsolutePath()+“line.txt”'...漂亮有趣,而不是因为你忘了文件分隔符。改用'new File(“line.txt”)。getAbsolutePath()'。 – Tom 2014-09-27 17:17:36
@JarrodRoberson“重复”的问题是关于C#并且没有被接受的答案。 (这两个答案并不是真正有用的,恕我直言。)所以我不确定这是否会回答OP的问题。 – 5gon12eder 2014-09-27 17:40:44