以相反的顺序读取和写入文件 - Java

时间:2011-06-28 15:00:41

标签: java io

我有一个非常大的文件(甚至可能是1G),我想以相反的顺序(在Java中)创建一个新文件。 例如:

Original file:

This is the first line
This is the 2nd line
This is the 3rd line

The reversed file:

This is the 3rd line
This is the 2nd line
This is the first line

由于文件非常大,一次将整个文件加载到内存并反转顺序可能会有问题(我可以使用的内存有限)。 我怎样才能在Java中实现这一目标?

由于

8 个答案:

答案 0 :(得分:6)

没什么特别直接的,我很害怕。但是你可以轻松地创建一些包含RandomAccessFile的ReverseBufferedRead类。

另见here

答案 1 :(得分:5)

通过几百行的块读取文件,颠倒块中行的顺序并将它们写入临时文件。然后以相反的顺序加入临时文件并清理。

换句话说,使用磁盘而不是内存。

答案 2 :(得分:2)

我建议为输出创建一个RandomAccessFile,并使用setLength()使其大小合适。

然后开始扫描原始文件并以相反的方式从RandomAccessFile结尾开始以块的形式写出来。

Java-ish Pseudo:

out.seek(size_of_out_file); //seek to end
RandomAccessFile out = new RandomAccessFile("out_fname", "rw");
out.setLength(size_of_file_to_be_reversed)
File in = new File ("in_fname");
while (hasMoreData(in)){
  String chunk = in.readsize();
  out.seekBackwardsBy(chunk.length());
  out.write(chunk.reverse);
  out.seekBackwardsBy(chunk.length());
}

答案 3 :(得分:1)

以相反的顺序逐行读取文件基本上很棘手。

如果您有固定宽度编码,那么不好。如果你有一个可变宽度编码,你可以检测到etc的第一个字节(例如UTF-8),这是可行的。如果编码是可变宽度而没有合理的方法来确定边界(或者如果它使用“移位”),那么几乎不可能有效地进行。

我在C#in another question中有一个实现,但要将它移植到Java需要花费大量的精力。

答案 4 :(得分:1)

如果您使用类似leonbloy的RandomAccessFile建议您可以使用FileChannel

要跳到文件的末尾,您可以读取该行并将其写入另一个文件。

Java教程中有一个简单的例子:example

答案 5 :(得分:0)

我会假设您知道如何阅读文件。我建议你这样做的一种方法是使用泛型类型字符串的ArrayList。因此,您阅读文件的每一行并将其存储在该列表中。阅读后,您打印出列表或做任何你想做的事。

刚刚写了一些可能有帮助的内容:http://pastebin.com/iWTVrAvm

答案 6 :(得分:0)

使用RandomAccessFile读取 - 使用randomAccesFile.length()定位文件并使用BufferedWriter

进行写入

答案 7 :(得分:0)

更好的解决方案是使用Apache Commons IO软件包中提供的ReversedLinesFileReader。在这里查看API https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/ReversedLinesFileReader.html