Чтение и запись файла в обратном порядке - Java - PullRequest
2 голосов
/ 28 июня 2011

У меня есть очень большой файл (может быть даже 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 ]

6 голосов
/ 28 июня 2011

Боюсь, ничего особенного. Но вы можете легко создать некоторый (скажем) класс ReverseBufferedRead, обертывающий RandomAccessFile .

См. Также здесь .

5 голосов
/ 28 июня 2011

Чтение файла чанками из нескольких сотен строк, обратный порядок строк в чанках и запись их во временные файлы.Затем объедините временные файлы в обратном порядке и очистите.

Другими словами, используйте диск вместо памяти.

2 голосов
/ 28 июня 2011

Я бы предложил сделать RandomAccessFile для вывода и использовать setLength (), чтобы сделать его подходящим по размеру.

Затем запустите сканирование исходного файла и запишите его кусками, начиная с конца RandomAccessFile, в обратном порядке..

Java-ish Псевдо:

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());
}
1 голос
/ 28 июня 2011

Если вы используете RandomAccessFile, как предложил leonbloy, вы можете использовать FileChannel

, чтобы перейти к концу файла, затем вы можете прочитать строку и записать ее в другой файл.

В уроках Java приведен простой пример: пример

1 голос
/ 28 июня 2011

Строковое чтение файла в обратном порядке крайне сложно.

Это не слишком плохо, если у вас есть кодировка фиксированной ширины. Это возможно, если у вас есть кодировка переменной ширины, в которой вы можете обнаружить первый байт и т. Д. (Например, UTF-8). Это практически невозможно сделать эффективно, если кодирование имеет переменную ширину без разумного способа определения границ (или если оно использует, например, «смещение»).

У меня есть реализация на C # в другом вопросе , но потребуется немало усилий, чтобы перенести ее на Java.

0 голосов
/ 19 декабря 2015

Лучшим решением является использование ReversedLinesFileReader, предоставляемого в пакете ввода-вывода Apache Commons. Посмотрите на API здесь https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/ReversedLinesFileReader.html

0 голосов
/ 28 июня 2011

Чтение с использованием RandomAccessFile - расположение файла с использованием randomAccesFile.length () и запись с использованием BufferedWriter

0 голосов
/ 28 июня 2011

Я предполагаю, что вы знаете, как читать файл.Один из способов, который я бы посоветовал вам сделать, это с помощью ArrayList строки общего типа.Таким образом, вы читаете каждую строку файла и сохраняете его в этом списке.После прочтения вы распечатываете список или делаете все, что хотите.

Просто написал кое-что, что могло бы помочь здесь: http://pastebin.com/iWTVrAvm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...