| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > замена слов в текстовом файле |
| Автор: Pawl 30.9.2011, 11:11 |
| Доброго времени суток, Господа! Похожие вопросы тут обсуждались, но ответа для себя я так и не нашёл. Так вот, есть текстовый файл. Можно ли прямо в нем заменить определенное слово другим словом? Если использовать временный файл, то больших проблем тут нет, а вот если работать только с данным файлом? Я пытаюсь через RandomAccessFile, но пока не получается. Может, чего полезного посоветуете? Спасибо! |
| Автор: Samotnik 30.9.2011, 11:15 |
| Pawl, Считай файл в буфер, измени слова, выведи результат из буфера в файл. |
| Автор: LSD 30.9.2011, 11:35 |
| Если слово такое же по длине(в байтах) , то проблем нет. Просто переписываешь это место. Если слово короче, то записываешь слово начиная с первой позиции старого слова, затем берешь байт следующий за последним байтом старого слова и пишешь в позицию следующую за новым словом. И так далее до конца файла. После чего соответственно уменьшаешь его длину. Плюс это все желательно делать блоками, а не побайтово. Если слово длиннее, то вначале увеличиваешь длину файла, и смещаешь данные в конец файла, а затем уже пишешь новое слово. |
| Автор: LSD 30.9.2011, 16:28 | ||
|
| Автор: Pawl 30.9.2011, 18:52 |
Ого, спасибо! Честно, с пакетом NIO не работал, так что пока не понял, то ли это, что мне надо... Пойму - отпишусь |
| Автор: Pawl 1.10.2011, 17:48 |
| По поводу примера г-на LSD. Если я правильно понял, в нем в буфер считывается кусок данных из файла, затем маркер сдвигается на заданную величину и в файл записываются данные из того же буфера, т. е. тот же кусок данных. А можно ли в файле ЗАМЕНЯТЬ этот кусок на какой-то другой, задаваемый пользователем? |
| Автор: LSD 3.10.2011, 11:12 | ||||||
Этот код просто сдвигает данные в файле начиная с указанной позиции, на указанную дельту. Вызов move(channel, 3, -2) порождает такие изменения (BUFFER_SIZE = 2 для наглядности):
После чего надо вызывать:
и получим:
Т.е. алгоритм такой: - конвертируем строку в байты - ищем байты в файле - конвертируем слово на которое надо заменить в байты - если слово короче --- сдвигаем байты --- уменьшаем длину файла - если слово длиннее --- увеличиваем длину файла --- смещаем байты - записываем новое слово начиная со смещения старого слова |
| Автор: Pawl 5.10.2011, 10:21 |
Спасибо, достаточно наглядно. Думаю, дальше разберусь сам. |
| Автор: Pawl 7.10.2011, 14:45 |
| Да, опрометчиво закрыл тему! с заменой слова на слово такой же или меньшей длины разобрался, а вот с этим: не очень. Можно, пожалуйста, пример, как это сделать? Спасибо! |
| Автор: LSD 7.10.2011, 15:03 |
| Увеличить длину можно с помощью RandomAccessFile.setLength() (все равно, FileChannel создавать надо через него). Алгоритм сдвига байтов в конец файла такой же как и в начало, только начинать надо с конца сдвигаемой области, а не с начала. |
| Автор: Pawl 7.10.2011, 16:20 |
Спасибо, уже нашел http://devhead.ru/read/java-kak-vstavit-stroku-v-nachalo-fajla/ на похожий пример! |