Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение и редактирование текстового файла, Как отредактировать файл во время чтения 
:(
    Опции темы
Anyone
Дата 19.3.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Здравствуйте!
Вот мой код для построчного чтения из файла:
Код

FileInputStream fin = null;
BufferedReader reader = null;
...
fin = new FileInputStream(file);
reader = new BufferedReader(new InputStreamReader(fin, "UTF-8"));
...                
  do{
    if (canReadNext){
      line = reader.readLine();
    }
...
  }while (line != null);

У меня возникла необходимость после чтения строк, изменять их, и перезаписывать (чтобы в случае остановки пользователем можно было продолжить чтение с места остановки).
Возможно ли одновременно и читать и писать в один и тот же файл, или нужно полностью перезаписывать его?
Спасибо.
PM MAIL   Вверх
jk1
Дата 19.3.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

Возможно ли одновременно и читать и писать в один и тот же файл

Возможно. Например, используя RandomAccessFileПример.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Anyone
Дата 19.3.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



jk1
спасибо за подсказку, только у меня возникла проблема с кодировками.
Мне нужно считывать файл в кодировке utf-8 построчно, выполнять разбор строки:
Код

line = raf.readLine();
String [] words = line.split(";");

но в массиве words получаю строки с неправильной кодировкой.
Как решить данную проблему?
PM MAIL   Вверх
jk1
Дата 19.3.2010, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

Как решить данную проблему? 

Указать в коде
Код

reader = new BufferedReader(new InputStreamReader(fin, "UTF-8"));

вместо UTF-8 ту кодировку, в которой написан текст в файле


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
dobrolub
Дата 19.3.2010, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



Цитата(Anyone @  19.3.2010,  12:42 Найти цитируемый пост)
У меня возникла необходимость после чтения строк, изменять их, и перезаписывать (чтобы в случае остановки пользователем можно было продолжить чтение с места остановки).
Возможно ли одновременно и читать и писать в один и тот же файл, или нужно полностью перезаписывать его?


Для того чтобы такой подход работал надо поставить ограничение чтобы изменение, по количеству байтов, было равно количеству байтов изменяемого текста.
PM   Вверх
Anyone
Дата 19.3.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(dobrolub @  19.3.2010,  21:10 Найти цитируемый пост)
Для того чтобы такой подход работал надо поставить ограничение чтобы изменение, по количеству байтов, было равно количеству байтов изменяемого текста.

Большое спасибо!

Цитата(jk1 @  19.3.2010,  20:40 Найти цитируемый пост)
Указать в коде вместо UTF-8 ту кодировку, в которой написан текст в файле

Я имею в ввиду если использовать RandomAccessFile, то как потом считывать строки с файла в кодировке utf8:
Код

raf = new RandomAccessFile(new File("..."),"rw");
line = raf.readLine();
words = line.split(";");

В массиве получаю "мусор".
PM MAIL   Вверх
jk1
Дата 19.3.2010, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Например, вот так:
Код

        RandomAccessFile raf = new RandomAccessFile(new File("utf_sample.txt"), "rw");
        byte[] buffer = new byte[(int)raf.length()];
        raf.readFully(buffer);
        System.out.println(new String(buffer,"UTF-8"));

Для файлов размером больше диапазона int надо что-то похитрее, например вычитывать массив со смещением от начала файла.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
dobrolub
Дата 20.3.2010, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



Интересная у тебя задачка, но я думаю так, с наскоку её может и не решить. По крайней мере тут надо учитывать, что в некоторых кодировках символы могут занимать неодинаковое число байтов. Практически, тебе надо знать как текст мапируется в байтовый массив который и представляет собой файл. Это не из простых задачка - это точно, и для каждой кодировки будет решаться по-своему.  Так что когда решишь  -  мастером станешь! А пока, мне представляется, что самым практичным способом будет запись во второй файл с совмещением файлов при открытии исходного файла, где частично отредактированный файл (файл изменений) замещает часть исходного до определённой метки, которую надо сохранять в момент записи во временный файл изменений. Файл изменений хранит текст от начала файла до курсора юзера.
PM   Вверх
Anyone
Дата 20.3.2010, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(jk1 @  19.3.2010,  23:46 Найти цитируемый пост)
Например, вот так:

Спасибо, это мне помогло.


Цитата(jk1 @  19.3.2010,  23:46 Найти цитируемый пост)
Для файлов размером больше диапазона int надо что-то похитрее, например вычитывать массив со смещением от начала файла. 

Думаю удобней всего использовать raf.readFully(b, off, len);

Остается только не понятно что за зверь RandomAccessFile.readUTF() и почему он возвращает null?
PM MAIL   Вверх
jk1
Дата 20.3.2010, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



RandomAccessFile.readUTF() вам вряд ли поможет, дело в том, что он читает т. н. modified UTF-8:
Цитата

The first two bytes are read, starting from the current file pointer, as if by readUnsignedShort. This value gives the number of following bytes that are in the encoded string, not the length of the resulting string. The following bytes are then interpreted as bytes encoding characters in the modified UTF-8 format and are converted into characters.

Об отличиях modified UTF-8
Значит, этот метод поможет вам только в случае, когда читаемый текст был записан с помощью RandomAccessFile.writeUTF()


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Anyone
Дата 20.3.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Ребята, всем спасибо.

С помощью RandomAccessFile ничего хорошего не выходит (из-за кодировки), потому решу задачу следующим образом:
1. Прочитаю файл  с помощью FileInputStream и BufferedReader и запишу его в массив String[]
2. Внесу изменения в массив
3. Перезапишу файл
Только чтоб не потерять данные в случае сбоев придется перезаписывать файл на каждой итерации при работе с массивом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0956 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.