2013-09-24 2 views
1

Интересно, есть ли способ читать текстовый файл по строкам с конца с FTP-сервера. Мне нужно прочитать большой файл, и меня интересуют только последние несколько строк.Java - читать файл из потока с конца

Я могу прочитать последнюю строку из файла на моем HD с кодом на этот вопрос: Quickly read the last line of a text file?, и я тоже могу прочитать файл на FTP-сервере по строке с кодом оттуда: Java. Read file from FTP but DON'T download it whole.

Но в первом случае функция tail использует файл переменной типа File, тогда как второй код использует переменный тип InputStream.

Когда я искал способ преобразования потока в файл, я обнаружил, что только реальный способ загрузки содержимого в файл tmp (How to convert InputStream to virtual File). Но я не хочу загружать этот файл, потому что он может быть очень большим, как я писал.

Кто-нибудь знает другой способ сделать это?

+0

Я не думаю, что мы можем читать файл, начиная с последней строки с FTP-сервера. Сначала вы должны скачать файл. –

ответ

1

Невозможно. Но вы можете прочитать поток ввода за строкой и запомнить только несколько последних строк. Если появится следующая строка, просто забудьте первую прочитанную строку.

+0

Спасибо. В случае большого файла, что будет лучше и эффективнее: ваше решение или сохранить файл на диске и прочитать последние (несколько) строк? – Line

+0

Это решение выполняется быстрее, когда вы пропустите один шаг - сохранение файла на диске. Остальная часть процесса одинаков - просто используйте поток ввода, полученный с ftp-сервера вместо локального файла: – agad

+0

Когда я сохраняю файл на диске, я могу использовать код для чтения с конца, без чтения каждой строки с самого начала, с Эрик Лещинский код из http://stackoverflow.com/questions/686231/java-quickly-read-the-last-line-of-a-text-file, как я писал в вопросе. – Line

1

Невозможно использовать протокол FTP. Протокол поддерживает только загрузку файла, начиная с самого начала. (Существует дополнительная функция, позволяющая перезапустить прерывистую передачу на полпути, но это зависит от того, как сервер отправляет непрозрачные «маркеры», которые представляют возможные точки возобновления. Я не вижу, как вы могли бы использовать это, чтобы пропустить до конца произвольный файл.)

Если вы ищете альтернативы, рассмотрите возможность использования HTTP с комбинацией запросов HEAD и GET-запросов с заголовками Range. (Это зависит от сервера, распознающего эти запросы ...)

Смежные вопросы