![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Доброго времени суток, Господа!
Похожие вопросы тут обсуждались, но ответа для себя я так и не нашёл. Так вот, есть текстовый файл. Можно ли прямо в нем заменить определенное слово другим словом? Если использовать временный файл, то больших проблем тут нет, а вот если работать только с данным файлом? Я пытаюсь через RandomAccessFile, но пока не получается. Может, чего полезного посоветуете? Спасибо! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
Pawl, Считай файл в буфер, измени слова, выведи результат из буфера в файл.
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Если слово такое же по длине(в байтах) , то проблем нет. Просто переписываешь это место.
Если слово короче, то записываешь слово начиная с первой позиции старого слова, затем берешь байт следующий за последним байтом старого слова и пишешь в позицию следующую за новым словом. И так далее до конца файла. После чего соответственно уменьшаешь его длину. Плюс это все желательно делать блоками, а не побайтово. Если слово длиннее, то вначале увеличиваешь длину файла, и смещаешь данные в конец файла, а затем уже пишешь новое слово. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
А можно примерчик, пожалуйста? Добавлено через 2 минуты и 19 секунд
Спасибо за вариант, но это, по сути та же запись во временный файл, который находится в буфере, а хотелось бы работать НЕПОСРЕДСТВЕННО с файлом! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Ого, спасибо! Честно, с пакетом NIO не работал, так что пока не понял, то ли это, что мне надо... Пойму - отпишусь -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
По поводу примера г-на LSD. Если я правильно понял, в нем в буфер считывается кусок данных из файла, затем маркер сдвигается на заданную величину и в файл записываются данные из того же буфера, т. е. тот же кусок данных. А можно ли в файле ЗАМЕНЯТЬ этот кусок на какой-то другой, задаваемый пользователем?
-------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| LSD |
|
||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Этот код просто сдвигает данные в файле начиная с указанной позиции, на указанную дельту. Вызов move(channel, 3, -2) порождает такие изменения (BUFFER_SIZE = 2 для наглядности):
После чего надо вызывать:
и получим:
Т.е. алгоритм такой: - конвертируем строку в байты - ищем байты в файле - конвертируем слово на которое надо заменить в байты - если слово короче --- сдвигаем байты --- уменьшаем длину файла - если слово длиннее --- увеличиваем длину файла --- смещаем байты - записываем новое слово начиная со смещения старого слова -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||
|
|||||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Спасибо, достаточно наглядно. Думаю, дальше разберусь сам. -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Да, опрометчиво закрыл тему!
с заменой слова на слово такой же или меньшей длины разобрался, а вот с этим: не очень. Можно, пожалуйста, пример, как это сделать? Спасибо! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Увеличить длину можно с помощью RandomAccessFile.setLength() (все равно, FileChannel создавать надо через него). Алгоритм сдвига байтов в конец файла такой же как и в начало, только начинать надо с конца сдвигаемой области, а не с начала.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
-------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |