2014-09-27 53 views
-2

所以我有这个文件:读取和删除X线在文件

randomline 
ernegvggvdr 
dsvdfssvdsv 
dfsfvfvs 
svdfsdfdfs 
dfsfvfv 
dsvvsvvfggd 

这正好为线路的成千上万。事实上,它大约有四万五千行。

我想读取前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

文件是连续的。您不能只删除文件开头的行。你可以做的是1.逐行读取文件。 2.对前100个读取行不做任何操作。 3.将剩余的行写入另一个文件。 4.删除原始文件。 5.将创建的文件重命名为原始名称。阅读Java IO教程:http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html – 2014-09-27 17:10:45

+0

'new File(“”)。getAbsolutePath()+“line.txt”'...漂亮有趣,而不是因为你忘了文件分隔符。改用'new File(“line.txt”)。getAbsolutePath()'。 – Tom 2014-09-27 17:17:36

+0

@JarrodRoberson“重复”的问题是关于C#并且没有被接受的答案。 (这两个答案并不是真正有用的,恕我直言。)所以我不确定这是否会回答OP的问题。 – 5gon12eder 2014-09-27 17:40:44

回答

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行:
    • 什么都不做。
  • 重复在输入的全部剩余线路:
    • 写行到输出文件。
  • 关闭这两个文件。