В Java, как я могу перебирать строки в текстовом файле от начала до конца - PullRequest
0 голосов
/ 03 апреля 2010

В основном мне нужно взять текстовый файл, такой как:

Фред
Берни
Генри

и сможете прочитать их из файла в порядке

Генри
Берни
Fred

Фактический файл, из которого я читаю, имеет размер> 30 МБ, и было бы не совсем идеальным решением прочитать весь файл, разбить его на массив, перевернуть массив и затем перейти оттуда. Это занимает слишком много времени. Моя конкретная цель - найти первое вхождение строки (в данном случае это «InitGame») и затем вернуть начало позиции начала этой строки.

Я делал что-то подобное в python раньше. Мой метод состоял в том, чтобы искать в конце файла - 1024, затем читать строки до тех пор, пока я не дошел до конца, затем искать еще 1024 из моей предыдущей начальной точки и, используя tell (), я бы остановился, когда доберусь до предыдущего отправная точка. Поэтому я читал эти блоки в обратном направлении от конца файла до тех пор, пока не нашел нужный текст.

Пока что у меня есть куча времени, чтобы делать это на Java. Любая помощь будет принята с благодарностью, и если вы живете недалеко от Балтимора, она может даже привести к тому, что вы получите свежее испеченное печенье.

Спасибо!

Дополнительная информация:

Мне нужно искать в обратном направлении, потому что файл, который я читаю, является лог-файлом для игры, для которой я размещаю сервер (это | err | сервер от городского террора. Посмотрите его). В лог-файл записывается каждое событие, которое происходит в игре, и затем моя программа будет анализировать каждое событие, обрабатывать его и затем воздействовать на него (например, он отслеживает выстрелы в голову людей, а также автоматически пинает людей, которые находятся в d-bag). ). Мне нужно вернуться к самой последней записи InitGame, чтобы я мог создать экземпляр всех объектов игрока и позаботиться обо всем остальном, что нужно было позаботиться с самого начала этой игры. В файле есть сотни событий InitGame, но я хочу последнее. Если есть лучший способ сделать это, не требующий поиска в обратном направлении, пожалуйста, дайте мне знать.

Спасибо

Ответы [ 4 ]

1 голос
/ 03 апреля 2010

Вы можете просто повторить свое решение Python, используя RandomAccessFile, и может быть пользовательским подклассом LineNumberReader (или просто Reader) поверх него.

0 голосов
/ 05 апреля 2010

Итак, ТИЛ, что мне нужно быть более многословным, когда я объясняю, что именно я делаю.По сути, я пишу программу, которая управляет игровым сервером, который я запускаю.Чтобы программа синхронизировалась с игрой, ей нужно найти самую последнюю строку InitGame, а затем прочитать оттуда, чтобы она могла записывать все эти попадания, убийства, соединения и разъединения, необходимые для начала раунда.,Поскольку файл журнала может быть довольно большим (в прошлый раз, когда я забыл его очистить, он занимал более 500 МБ текста), вместо поиска спереди, я хочу искать сзади.В Java не было встроенного способа сделать это.После поиска по большому количеству интернетов, я наткнулся на это: http://mattfleming.com/node/11. После этого я вынул класс BackwardsFileInputStream и использовал его.Затем в моем приложении я переворачиваю символы.В следующий раз я смогу создать свой собственный метод, теперь, когда я увижу, как это делается, и лучше пойму.

Итак, как только программа прочитает файл журнала из самой последней InitGame, она будет имитировать хвост-f и прочитайте файл журнала, как написано.

0 голосов
/ 05 апреля 2010

При поиске в обратном порядке на ум приходят два ответа. Первый - это поиск вперед и сохранение последнего найденного текста InitGame на тот момент, когда вы дойдете до конца файла (и перезапись его, когда появляется другое InitGame, когда вы читаете файл).

Второе решение - определить размер файла (используя f.length ()), разделить его на большие куски, которые перекрываются более чем на максимальный размер фрагмента InitGame (чтобы избежать проблем из-за правильного разбиения двух кусков на интересную часть), и начните чтение с последнего и переходите к началу файла (используя функцию skip () в Reader, чтобы перейти к желаемой позиции чтения: фактическое разбиение файла не требуется). Если вы уверены, что нет забавных многобайтовых символов, может пригодиться RandomAccessFile.

Самым эффективным решением, конечно же, является чтение выходных данных файла журнала, сохраняя ссылку на последнюю найденную игру InitGame. Таким образом, вам никогда не придется перечитывать одни и те же данные дважды. Вы можете даже настроить все так, чтобы ваша Java-программа просыпалась раз в несколько секунд, просматривала файл и читала вновь добавленные строки.

0 голосов
/ 03 апреля 2010

В Linux есть несколько отличных инструментов для разбора текста, которые могут лучше подойти, чем пытаться сделать это в Java.

...