我有一个非常大的文件(甚至可能是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中实现这一目标?
由于
答案 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