Доступ к произвольной строке файла

214
24 августа 2017, 19:24

Здравствуете, столкнулся с вопросом доступа к произвольной строки в файле. Если я хочу вывести например 67000 строку ... Но не хочу бежать 1, 2, 3,..., 66999,и наконец 67000. Как можно сделать это быстрее? Например как с массивом? arr[67000]? Слышал o RandomAccessFile, но суть не понял.

Answer 1

Дмитрий, если вы не собираетесь менять файл и он у вас работает в роли БД, то для скорости работы 1 раз считайте файл в лист (или в мап, если вам нужна определенная буква) и им пользуйтесь.

Радо каждого слова читать файл от начала и до конца - будет очень долго (в сравнении с коллекцией). А если взять не модифицируемую коллекцию, то ещё немного в скорости выиграете (совсем чуть-чуть).

Но по каждому слову бегать по всему файлу (в 67к строк) это не то, что нужно

Answer 2

Файл - это плоские данные, где там находятся начала строк, да и вообще, есть ли там строки текста, картинки или музыка - это неизвестно. В файле может быть все что угодно, и вероятно даже без хлеба.

Чтобы получить доступ к конкретной строке, сразу без регистрации и смс, нужно где-то и как-то узнать позицию файла, где эта строка начинается. К примеру, прочитать все строки в файле, записывая в другой файлик места, откуда эта строка начинается, а когда надо будет прочитать нужную строчку - мы читаем весь этот маленький файлик со смещениями, открываем большой файл, через RandomAccessFile переходим к нужному месте и оттуда читаем. Фактически, мы таким образом изобрели индексы, а процесс создания таких вспомогательных файликов называется индексированием.

Задача со словарем может быть решена еще проще: зная размер файла, и предварительно отсортировав слова в файле в алфавитном порядке (на самом деле в порядке кодировки, но это тонкости), можно методом половинного деления, искать позицию слова в файле приблизительно, постепенно подбираясь к нужному. Свой словарь я так и делал, разве что seek делал на 200 символов раньше, а потом читал одну строчку и отбрасывал ее, таким образом я находил начало строки. Все собираюсь победить к нем эксепшены и выложить, да времени не найду - может допишите за меня?

READ ALSO
Как использовать общий SharedPreference между Unity и Android?

Как использовать общий SharedPreference между Unity и Android?

Моя основная задача заключается в том чтобы, научить Unity читать значения из SharedPreference, я пробовал следовать этой инструкции, но ничего не работает,...

208
Создание новой строки с помощью java

Создание новой строки с помощью java

Имеются две таблицы Departments и EmployeesПри выборе строки в Departments происходит переход по employeesID в таблицу Employees

226
Адаптивность и макет

Адаптивность и макет

ЗдравствуйтеПоявился вопрос по поводу макета

257