Реализация итератора по данным из URL
От: mbait  
Дата: 06.06.18 05:48
Оценка:
Предположим, что следующий код загружает коллекцию однородных объектов в JSON или XML:

Parser parser = new Parser(new URL("https://example.com/api/endpoint").openStream());


Для каждого объекта из коллекции выполняется какая-то логика, которая может занимать до минуты. При этом парсер потоковый. Интерфейс всего процесса загрузки и декодирования оборачивается в java.util.Iterator, и код выполнения логики, соответственно, будет использовать методы hasNext() и next(). Что произойдёт, если сервер не дождавшись, пока данные будут полностью отправлены, закроект подключение?

Или проще говоря, URL::openStream возвращает InputStream, данные которого полностью считываются в память? Или же данные по сети передаются по времени пропорционально вызовам InputStream::read?
Re: Реализация итератора по данным из URL
От: GarryIV  
Дата: 06.06.18 05:56
Оценка:
Здравствуйте, mbait, Вы писали:

M>Или проще говоря, URL::openStream возвращает InputStream, данные которого полностью считываются в память? Или же данные по сети передаются по времени пропорционально вызовам InputStream::read?

Второе, там вообще в общем случае данных может быть больше чем памяти. Соответственно все поломается.
WBR, Igor Evgrafov
Re: Реализация итератора по данным из URL
От: vsb Казахстан  
Дата: 16.06.18 00:52
Оценка:
Здравствуйте, mbait, Вы писали:

M>Что произойдёт, если сервер не дождавшись, пока данные будут полностью отправлены, закроект подключение?


При очередном вызове inputStream.read он может выбросить исключение.

M>Или проще говоря, URL::openStream возвращает InputStream, данные которого полностью считываются в память? Или же данные по сети передаются по времени пропорционально вызовам InputStream::read?


А что гадать, залезьте дебаггером, да посмотрите. У меня HttpURLConnection возвращает инстанс класса HttpURLConnection$HttpInputStream, который является обёрткой над KeepAliveStream, который является обёрткой над BufferedInputStream (с размером буфера в 8КБ), который является обёрткой (я "люблю" жаву) над, наконец-то, SocketInputStream-ом. Собственно 8 КБ данных в буфере лежать будут (включая HTTP-заголовки и тд), потом кинет исключение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.