| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java ME (J2ME) > Позиционирование в файле |
| Автор: WildChild 28.3.2006, 13:11 | ||||
| допустим есть файл (это только пример, на самом деле он больше) Структура файла:
Как позиционироваться в файле, чтобы можно было начинать не с начала файла, а из произвольного места? Вывод на экран мобилы должен быть, приблизительно, такой:
Спасибо! |
| Автор: powerOn 29.3.2006, 12:04 |
| Попробуй вначале все данные из файла прочитать в массив. Потом с поизвольно места читаь легко сможешь. |
| Автор: Dancer 29.3.2006, 12:45 |
| какой массив, не вздумай!!! (я там понимаю никакой памяти в телефоне не хватит, если ты будешь не хилый словарик держать в телефоне. просто напросто приложение по OutOfMemory загнётся. Есть метод тайкой как skip() точно не помню, нужно будет проверить, вот если тебе это подойдёт, то ты можешь узнать размер твоего файлика и пропустить первые N байт, потом начать читать с N+1 байта. (это если JSR-75 используешь и файлик у тебя в файловой системе телефона валяется) Если же файлик ты таскаешь вместе со своим мидлетом, то у тебя есть InputStream скорее всего на этот файлик, там то же можно skip(long n) применить. --------------- Добавлено @ 12:57 да, лучше всего думаю для твоей структуры хранения подойдёт XML (для мобилок есть библиотечка kXML. Очень не плохая штука http://kxml.sourceforge.net) Так что сделаешь либо хеш функцию для вычисления ID английского слова и это ID у тебя будет как атрибут в XML тэге, по этому атрибуту будешь искать превод слова. что-то наподобие <dict> <word> <eng_word ID = "123456789">mother</eng_word> <rus_word ID = "123">мама</rus_word> </word> </dict> Хотя конечно, структуру делаешь так, как подскажет здравый смысл и опыт (то что выше это просто пример и ничего более), далее расширение на другие языки можно будет делать достаточно просто, ну и соответственно все буковки естественно лучше всего будет писать в уникоде /uXXXX |
| Автор: redrick 29.3.2006, 12:59 |
| MoonCat, если размер файла действительно большой, то я бы поостерегся весь его читать в массив(10кб юникода это на самом деле даже не страница). Предлагаю запомнить в массиве просто смещения в байтах каждой строчки. |
| Автор: Dancer 29.3.2006, 13:19 |
| redrick, не плохое решение про хранить в массиве смещения, но тогда уже лучше делать второй файлик, зависимый от нашего файла словаря, то есть если внесли изменения в словарь, то запускаем скрип (ну, или кто что напишет), который бегает по нашему словарю и запихивает в другой фалик смещения для каждой строчки (возможно даже лучше писать ID для этой строчки и смещение к этой строчки. В словаре сначала будет идти ID слова далее eng:rus\n) тогда можно будет позиционироваться по строчками и если сделать хорошую функцию создания ID для слова (в Кнуте не плохо данные алгоритмы описаны) то позиционироваться по файлику словаря будет достаточно легко. Самая загвоздка при создании хешей - это конечно решение коллизий, но это уже тема не этой беседы |
| Автор: powerOn 29.3.2006, 13:42 | ||
Более того, поиск через постоянные операции файлового ввода вывода не эффективен. Если речь идет о действительно большом словаре, то предлагаю немного поменять структуру файла. Дополнить например ее какими либо методанными по которым можно ускорить поиск. Например, вначале файла хранить таблицу, где обозначить с какой позиции начинаются слова на определенную букву. Или вообще разбить словарь на несколько файлов для каждой начальной буквы, ну и таком духе.... |
| Автор: WildChild 29.3.2006, 15:40 | ||||
| MoonCat, Dancer, redrick, спасибо большое за помощь! MoonCat, извини! Я не указал размер файла и тебе досталось. Sorry! В следующий раз буду повнимательней! На самом деле размер файла будет колебаться от 10 до N (в разумных пределах) слов. Dancer
ID русского и английского слов НЕ должы совпадать?
Я пробывал... Если попадаешь в середину байта, то очень не хорошая вещь получается... Можно, конечно, дальше читать до \n, ну и так далее. Но, сильно муторно... |
| Автор: Dancer 29.3.2006, 16:31 |
| ну, насчёт того должны эти ID совпадать или нет - не знаю. Если к примеру ты делаешь какую-то хитрую универсальную хеш функцию, то на вход подаёшь слово на любом языке, получаешь ID ищешь это ID и переводишь слово на любой доступный язык из твоего файлика. Если же тебе нужно чётко с английского на русский, то наверное лучше чтобы ID совпадали. (я же говорил, что это дано лишь для примера, и никак не руководство к действию. Как лучше организовать логику уже тебе думать (и выбирать, мне так кажется) Вот про то что мы попадем на серидину байта не совсем понял - это как? читаем то мы постоянно побайтно, так что прочить полбайта и остановиться просто не можем. (ты как себе такое представляешь. Реально видел такие ситуации?) |
| Автор: WildChild 29.3.2006, 20:35 |
| Я ошибся, сказав, что попадаю в середину байта. Наверное, в середину UTF символа, если так можно сказать. Ну в общем, не работало... Ошибку свою понял. |
| Автор: WildChild 30.3.2006, 20:22 | ||||||
Есть вот такой код
На строку 23 (если её раскомментировать) WTK22 выдает ошибку
В if, на строке 24, не входит... Текст xml-файла следующий
В чем проблема, не могу понять... Может кто сталкивался Работаю с kXML 2.2. |
| Автор: redrick 30.3.2006, 20:53 |
| ну наверное у того элемента всего один атрибут, а не 2 (хотя вроде как это должен быть <branch>...) чем гадать - залезь в дебагер да посмотри что на самом деле в parser в этой строчке |
| Автор: WildChild 30.3.2006, 21:52 | ||
Вот пример xml файла, из работающей программы взятой отсюда - http://lib.juga.ru/article/articleview/209/1/16/
|
| Автор: WildChild 31.3.2006, 11:34 | ||||
| Кажется я разобрался... Нельзя повторно использовать
Я так понимаю, что если его использовать повторно, то я попадаю сразу в конец документа... То есть первый раз попадаю на <root>, а второй вызов - на </root>, а не на <trunk>. Если я хочу гулять по тэгам, то необходимо делать следующее:
На том примере, что есть в данной теме я ещё не проверял. Проверил на другом - РАБОТАЕТ! |
| Автор: redrick 31.3.2006, 12:47 |
| ну вот, "а ты боялась..." =) |
| Автор: WildChild 31.3.2006, 12:50 |
| Думал, успею отредактировать свое сообщение... Ан нет. ;о) Просто, неправильно работает код... Буду ещё Спасибо за поддержку! |
| Автор: Dancer 31.3.2006, 14:28 | ||
|