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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как читать из ImputStream'a не дольше "чем"? 
:(
    Опции темы
KOp4iK
Дата 16.8.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!
Есть код:
Код

            String aLine = "";
            URL source = new URL(mobUrl);

            BufferedReader br = new BufferedReader(new InputStreamReader(source.openStream()));
            while(null != (aLine = br.readLine())) {
                output.append(aLine);
                output.append("\n");
            }
            br.close();


надо чтоб он выполнялся меньше 1 сек. (а то мы так "вечно" бум ждать)... имхо он будет на br.readLine() будет до тех пор пока не отвалиться... тогда как его прирвать? хотя мож не readLine() использовать?  
PM MAIL   Вверх
COVD
Дата 16.8.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Цитата

как его прирвать


наверное, внешним потоком закрыть соединение и тогда читающий поток получит в readLine() исключение и разблокируется. Но надо иметь ссылку на соединение, т.е. не пользоваться укороченной формой записи   "BufferedReader br = new BufferedReader(new InputStreamReader(source.openStream()));"
PM MAIL   Вверх
LSD
Дата 16.8.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Код

  public void read(Reader reader, StringBuffer output, long timeout) throws IOException
  {
    long start = System.currentTimeMillis();
    int read;
    char[] buffer = new char[128];
    while((System.currentTimeMillis() - start) < timeout && ((read = reader.read(buffer, 0, 128)) != -1))
      output.append(buffer, 0, read);
  }


Добавлено через 47 секунд
А потом уже разбивать прочитанный текст, на линии.


--------------------
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.
PM MAIL WWW   Вверх
KOp4iK
Дата 17.8.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А если на 
Цитата

reader.read(buffer, 0, 128)

мы сядем и будем ждать тайм оута?!?!
PM MAIL   Вверх
Maksym
Дата 17.8.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



KOp4iK
Вот эта часть условия станет false через указанный Вами timeout: (System.currentTimeMillis() - start) < timeout
PM MAIL   Вверх
KOp4iK
Дата 20.8.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да ладно!!!! (System.currentTimeMillis() - start) < timeout  мож и станет false, но мы об этом не узнаем так как будем сидеть внутри reader.read()

PM MAIL   Вверх
Maksym
Дата 20.8.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



KOp4iK
мм... давай тогда завернем (read = reader.read(buffer, 0, 128)) != -1) в отдельный поток
PM MAIL   Вверх
LSD
Дата 20.8.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(KOp4iK @  17.8.2007,  21:39 Найти цитируемый пост)
мы сядем и будем ждать тайм оута?!?!

Не будем. Метод reader.read(byte[], int, int) - неблокируемый, если в буффере нет данных, то он просто вернет 0.


--------------------
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.
PM MAIL WWW   Вверх
Maksym
Дата 20.8.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

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



Цитата(LSD @  20.8.2007,  18:12 Найти цитируемый пост)
Метод reader.read(byte[], int, int) - неблокируемый, если в буффере нет данных, то он просто вернет 0.

Мда ведь точно, протормозил я что-то здесь...
PM MAIL   Вверх
COVD
Дата 20.8.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Наверное, есть риск, что захватит 100% CPU, если практически вхолостую будет крутиться? Или нету?
PM MAIL   Вверх
LSD
Дата 21.8.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(COVD @  20.8.2007,  20:33 Найти цитируемый пост)
Наверное, есть риск, что захватит 100% CPU, если практически вхолостую будет крутиться? Или нету?

В принципе есть. Зависит от того как реализован InputStream, по идее он обращается к средствам ОС, и значит тики отдает. Но все равно попробовать стоит.

В крайнем случае можно сделать так:
Код

public void read(Reader reader, StringBuffer output, long timeout) throws Exception
{
  long start = System.currentTimeMillis();
  int read;
  char[] buffer = new char[128];
  while((System.currentTimeMillis() - start) < timeout && ((read = reader.read(buffer, 0, 128)) != -1))
  {
    if(read == 0)
      Thread.sleep(1);
    else
      output.append(buffer, 0, read);
  }
}



--------------------
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.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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