![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Anyone |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
Здравствуйте!
Вот мой код для построчного чтения из файла:
У меня возникла необходимость после чтения строк, изменять их, и перезаписывать (чтобы в случае остановки пользователем можно было продолжить чтение с места остановки). Возможно ли одновременно и читать и писать в один и тот же файл, или нужно полностью перезаписывать его? Спасибо. |
|||
|
||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Возможно. Например, используя RandomAccessFile. Пример. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
Anyone |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
jk1,
спасибо за подсказку, только у меня возникла проблема с кодировками. Мне нужно считывать файл в кодировке utf-8 построчно, выполнять разбор строки:
но в массиве words получаю строки с неправильной кодировкой. Как решить данную проблему? |
|||
|
||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Указать в коде
вместо UTF-8 ту кодировку, в которой написан текст в файле -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 11 Всего: 16 |
Для того чтобы такой подход работал надо поставить ограничение чтобы изменение, по количеству байтов, было равно количеству байтов изменяемого текста. |
|||
|
||||
Anyone |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
Большое спасибо!
Я имею в ввиду если использовать RandomAccessFile, то как потом считывать строки с файла в кодировке utf8:
В массиве получаю "мусор". |
||||||
|
|||||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Например, вот так:
Для файлов размером больше диапазона int надо что-то похитрее, например вычитывать массив со смещением от начала файла. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 11 Всего: 16 |
Интересная у тебя задачка, но я думаю так, с наскоку её может и не решить. По крайней мере тут надо учитывать, что в некоторых кодировках символы могут занимать неодинаковое число байтов. Практически, тебе надо знать как текст мапируется в байтовый массив который и представляет собой файл. Это не из простых задачка - это точно, и для каждой кодировки будет решаться по-своему. Так что когда решишь - мастером станешь! А пока, мне представляется, что самым практичным способом будет запись во второй файл с совмещением файлов при открытии исходного файла, где частично отредактированный файл (файл изменений) замещает часть исходного до определённой метки, которую надо сохранять в момент записи во временный файл изменений. Файл изменений хранит текст от начала файла до курсора юзера.
|
|||
|
||||
Anyone |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
Спасибо, это мне помогло.
Думаю удобней всего использовать raf.readFully(b, off, len); Остается только не понятно что за зверь RandomAccessFile.readUTF() и почему он возвращает null? |
|||
|
||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
RandomAccessFile.readUTF() вам вряд ли поможет, дело в том, что он читает т. н. modified UTF-8:
Об отличиях modified UTF-8 Значит, этот метод поможет вам только в случае, когда читаемый текст был записан с помощью RandomAccessFile.writeUTF() -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
Anyone |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 1.6.2008 Репутация: нет Всего: нет |
Ребята, всем спасибо.
С помощью RandomAccessFile ничего хорошего не выходит (из-за кодировки), потому решу задачу следующим образом: 1. Прочитаю файл с помощью FileInputStream и BufferedReader и запишу его в массив String[] 2. Внесу изменения в массив 3. Перезапишу файл Только чтоб не потерять данные в случае сбоев придется перезаписывать файл на каждой итерации при работе с массивом. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |