Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: BufferedReader, пропустить строку  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 552
Павел Гужанов,
А причем тут что возвращает?
"Прочитать 100 символов в буфер" выше писал.
3 июл 19, 14:32    [21919892]     Ответить | Цитировать Сообщить модератору
 Re: BufferedReader, пропустить строку  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 450
Если предположить, что я считал посимвольно 100 символов и не нашел там конец строки, то мне надо перейти на следующую строку. А как это сделать? Переход в BufferedReader происходит при readLine(), а он вызывает ошибку
3 июл 19, 14:32    [21919893]     Ответить | Цитировать Сообщить модератору
 Re: BufferedReader, пропустить строку  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9178
А \r и \n имеют вполне конкретные коды. Удивительно, да?
3 июл 19, 14:33    [21919895]     Ответить | Цитировать Сообщить модератору
 Re: BufferedReader, пропустить строку  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 552
Павел Гужанов
Если предположить, что я считал посимвольно 100 символов и не нашел там конец строки, то мне надо перейти на следующую строку. А как это сделать? Переход в BufferedReader происходит при readLine(), а он вызывает ошибку
да. Тогда читай по символьно до конца. Раз нельзя отбросить целиком невалидный файл. Парси его весь.
Цифры сюда дать 10 минут.
3 июл 19, 14:35    [21919898]     Ответить | Цитировать Сообщить модератору
 Re: BufferedReader, пропустить строку  [new]
lleming
Member

Откуда:
Сообщений: 1595
PetroNotC Sharp
lleming
Если имеется ввиду где в jre готовая реализация то такой нет если неошибаюсь, придется руки испачкать и написать самому.
готового чего? Найти символ в гиговом файле?


топикстартер спрашивает нет ли чтото вроде этого

while(line != null || !reader.lastState().isLineTooLong()){


найти символ подразумевает его искать т.е писать код алгоритма поиска.
3 июл 19, 14:56    [21919938]     Ответить | Цитировать Сообщить модератору
 Re: BufferedReader, пропустить строку  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 552
lleming,
ОК
3 июл 19, 15:03    [21919950]     Ответить | Цитировать Сообщить модератору
 Re: BufferedReader, пропустить строку  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 450
Всем спасибо за помощь.
Сделал так:
try {
        line = reader.readLine();
} catch (OutOfMemoryError e) {
	logger.error("Слишком большая строка " + counter);
	int symbol = reader.read()ж
	int i = 0;
	while(symbol != 10 && symbol != 13) {
		i++;
		symbol = reader.read();
	}
	logger.error("Длина строки " + i);
	line = reader.readLine();
	if(line != null && line.length() == 0)
	        line = reader.readLine();
}
3 июл 19, 15:34    [21919988]     Ответить | Цитировать Сообщить модератору
 Re: BufferedReader, пропустить строку  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 552
Павел Гужанов,
+1
Только лучше не доводить до райзе по памяти.
Ну и цифры не дал. Жаль.
Удачи!
3 июл 19, 16:14    [21920042]     Ответить | Цитировать Сообщить модератору
 Re: BufferedReader, пропустить строку  [new]
mayton
Member

Откуда: loopback
Сообщений: 40989
Павел Гужанов
BufferedReader reader = new BufferedReader(                     
            		new InputStreamReader(                             
            				new FileInputStream(pathToFile), charset));

String line = reader.readLine();
while(line != null){
   // обработка строки
   .....
   try{
      line = reader.readLine();
   }catch (OutOfMemoryError e){
      // Обрабтка ошибки
   }
}

Несколько мыслей.

Предположительно. Файл который ты читаешь - не совсем текстовый.
Потому-как сломать мозг хипу можно реально ооооочень длинными строками.
По факту Java поддерживает индексацию символов до 2 млрд. Но беря во внимание
что BufferedReader внутри использует StringBuffer который может делать реаллокации.
А реаллокации требуют 2 * n памяти плюс хвостик на расширение. Тут возможны варианты
что не хватило не памяти. А не хватило временной памяти которая нужна буферному ридеру
для копирования староого символьного массива в новое место. Но это моё предположение.
Я не изучал как работает этот ридер.

Железное решение твоей проблемы - читать файл не построчно а посимвольно. И принимать
решение на каждый символ. Формировать строки. С пониманием предметной области.
3 июл 19, 18:01    [21920150]     Ответить | Цитировать Сообщить модератору
 Re: BufferedReader, пропустить строку  [new]
mayton
Member

Откуда: loopback
Сообщений: 40989
}catch (OutOfMemoryError e){
      // Обрабтка ошибки
}

Так обычно не делают. Ошибка OOM не предполагает ее оперативного решения.
Она просто к сведению перед тем как исполнительная среда упадет. Обычно
если это происходит то память не удалось освободить и нет ресурсов на ее решение.
3 июл 19, 18:21    [21920168]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Java Ответить