2017-02-14 3 views
0

Любой отличный способ прочитать файл назад? Взглянул на класс Reader, но ничего там, кажется, не помогает. Моим вариантом использования является поиск последней строки файла, который соответствует условию (регулярное выражение, содержит строку и т. Д.).Groovy читать файл назад

Позже Edit:

Я думаю, этот вопрос на самом деле не является дубликатом хвоста один. Я вижу хвост как «живую» обработку файла. Моя проблема заключается в обработке больших файлов журнала (размер в десятках ГБ), поэтому загрузка всего файла в память не является вариантом. Содержимое файла статично (не обновляется во время обработки).

Например, каждый раз, когда объект обновляется, мы регистрируем строку, в которой указывается, какой пользователь сделал это, и в какой-то момент нам нужен последний пользователь, сгенерировавший это обновление.

Благодаря

+1

Это не очень личный характер. Вы можете посмотреть http://stackoverflow.com/questions/6011345/read-a-file-line-by-line-in-reverse-order, http://stackoverflow.com/questions/8664705/how- to-read-file-from-end-to-start-in-reverse-order-in-java и, возможно, еще много. –

+0

Я согласен с тем, что проблема сама по себе не характерна, но я пытаюсь понять, есть ли в ней какое-то изящное решение. – user4132657

+0

Не согласны ли вы размещать более подробную информацию с соответствующей информацией, такой как данные образца? – Rao

ответ

0

Это работает для меня:

String filePath = '/path/to/file' 
File file = new File(filePath) 
String sample = 'searchSample' 

file.text.split('\n').reverse().find {it.contains(sample)} 

UPD

Также возможно FileUtils # backWardsRead() будет полезным для вас.

+0

Загрузка полного содержимого файла в память невозможна из-за размера файла. Я предполагаю, что FileUtils # backWardsRead - это один из [здесь] (http://stackoverflow.com/questions/6011345/read-a-file-line-by-line-in-reverse-order). Это выглядит интересно, спасибо. – user4132657

0

Это не читает файл в обратном порядке, но он обрабатывает строки назад, что, по моему мнению, соответствует предполагаемому варианту использования «последней строки в файле, соответствующей условию».

import java.util.stream.Collectors 
new File('myfile.csv').newReader() 
         .lines() 
         .collect(Collectors.toList()) 
         .reverse() 
         .find { line -> line ==~ myRegex } 

Для этого требуется Java 8, поскольку она использует Stream API.

+0

Загрузка полного содержимого файла в память невозможна из-за размера файла – user4132657