powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
39 сообщений из 39, показаны все 2 страниц
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34688654
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

Читал тут JavaDoc API. Наткнулся на то, что описание InputStream.available() различается для разных версий Java. Особенно обратите внимание на Returns.

http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#available()

Returns:
the number of bytes that can be read from this input stream without blocking.

http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStream.html#available()

Returns:
the number of bytes that can be read from this input stream without blocking.

http://java.sun.com/javase/6/docs/api/java/io/InputStream.html#available()

Returns:
an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking or 0 when it reaches the end of the input stream.

Обычно этот метод использует для того, чтобы считывать данные из потока (Stream), не блокируя при этом нить (Thread, тоже поток, конечно, но я использовал термин нить для Thread, чтобы не было путаницы).

Рассмотрим версии 1.4.2 и 1.5.0. Вроде все не плохо. Узнаем, сколько байт можно считать из потока без блокировки, и считываем их. Проблемы начинаются, когда надо определить, что поток закончился. available() может вернуть 0, что говорит о том, что доступных данных нет, но данные могут стать доступны позже. И единственный способ определить то, что достигнут конец потока, это вызов метода read() и проверка возвращенного значения. Если достигнут конец потока, получим -1, иначе метод блокируется, если данные еще не доступны. Это верно для версий 1.4.2 и 1.5.0. Итак, гарантированно избежать блокировки и определять конец потока не получается. Из всего описания класса InputStream следует, что конец потока достигается тогда, когда в нем нет больше доступных данных и никогда больше не будет доступных данных. (Комментарии приветствуются.)

Посмотрим теперь на версию 6.0. Во-первых, напрягает слово "estimate". Нигде это не сказано, и можно только надеяться, что это оценка снизу, то есть по меньшей мере из потока можно считать такое число байт, какое вернул available(), но, может быть, в потоке доступно и больше. Также из описания следует, что available() возвращает 0, когда достигнут конец потока. Из этого можно заключить, что, возможно, изменилось определение понятия "конец потока". Я рассмотрю два варианта, один из предыдущего параграфа, другой новый.
(1) конец потока достигается тогда, когда в нем нет больше доступных данных и никогда больше не будет доступных данных.
(2) конец потока достигается тогда, когда в нем нет больше доступных данных, но, если данные появятся, конец потока будет сдвинут, и эти данные можно будет считать.

Предположи верно определение (1). Тогда, если метод available() вернул 0, мы больше никогда ничего считать из потока не сможем. С другой стороны, если конец потока не достигнут, то available() не должен возвращать 0, и предпологая, что этот метод не может возвращать отрицательные заначения, он вернет положительное число. Это приводит к выводу, что в потоке, конец которого не достигнут всегда есть доступные данные, и чтение может проходить без блокировки, что трудно себе представить, например, при медленном соединении по сети.

Предположи верно определение (2). Вообще говоря, этот вариант приводит к тем же проблемам, что в версиях 1.4.2 и 1.5.0, только прибавляется еще одна. Если предположить, что понятие конец потока общее для методов available() и read(), что естественно, то метод read() не гарантирует, что данных для чтения больше не будет.

Мне интересно ваше мнение по этому поводу. Проводил ли кто-нибудь эксперименты, всегда ли доступны данные для чтения в версии 6.0? Может это просто опечатка, и метод available() возвращает -1 по достижении конца потока? Не кажется ли вам, что, если бы available() возвращал -1 по достижении конца потока, это было бы удобнее? Если нельзя менять метод available() из-за обратной совместимости, то можно добавить isEndOfStrean(), который возвращает boolean?
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34688788
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InnateМне интересно ваше мнение по этому поводу. Проводил ли кто-нибудь эксперименты, всегда ли доступны данные для чтения в версии 6.0?
Блин, вот это 5. А не приходило в голову что InputStream это интерфейс с сотней реализаций. И данные могут качатся как из абсолютно разных источников? Именно поэтому такое послабление в документации и сделано. Надо ещё погуглировать или ReleaseNotes глянуть. Там будет более толковое объяснение.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34688934
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InputStream, для начала, - это не интерфейс, а абстракный класс. Возможно, у него есть и сотня реализаций, я не считал. Только я не вижу причин, почему сделано послабление, которое приводит к противоречию. Какой источник данных вы можите предложить, Blazkowicz, который бы соответствовал тому, что написано в документации, но противоречил бы более строгому описанию. Да, кстати в Release Notes я не нашел ничего про InputStream. Может дадите ссылку?
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689004
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689087
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InnateInputStream, для начала, - это не интерфейс, а абстракный класс.
Ооо, это многое меняет. Может посмотрим как в этом абстрактном классе реализован метод available()?
Код: plaintext
1.
2.
     public   int  available()  throws  IOException {
	 return   0 ;
    }
Сюрприз!

InnateВозможно, у него есть и сотня реализаций, я не считал.
Конечно, это ведь не важно. Метод available всегда возвращает 0, как видно из исходного кода абстрактного класса InputStream.

InnateТолько я не вижу причин, почему сделано послабление, которое приводит к противоречию.
Ну, другие видят, раз формулировку сменили.

InnateКакой источник данных вы можите предложить, Blazkowicz, который бы соответствовал тому, что написано в документации, но противоречил бы более строгому описанию.
Смотри Related Bugs. Спасибо Timm за оперативный поиск.

InnateДа, кстати в Release Notes я не нашел ничего про InputStream. Может дадите ссылку?
https://jdk6.dev.java.net/files/documents/5490/39025/jdk6-b45.html
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689109
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, Timm, за ссылку. Итак, то, что я описал для версий 1.4.2, 1.5.0 в 6.0 постарались исправить. Только, по-моему, не лучшем образом.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4401029
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689209
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz InnateInputStream, для начала, - это не интерфейс, а абстракный класс.
Ооо, это многое меняет.


Для Java это многое меняет.

Blazkowicz
Может посмотрим как в этом абстрактном классе реализован метод available()?
Код: plaintext
1.
2.
     public   int  available()  throws  IOException {
	 return   0 ;
    }
Сюрприз!


Нет, не сюрприз! По-моему там прямо сказано, что, хоть метод и реализован, его необходимо переопределить в наследнике. Так что, как метод available() реализован в самом InputStream не столь важно. А важен его контракт и предпологаемое его поведение.

Blazkowicz
InnateВозможно, у него есть и сотня реализаций, я не считал.
Конечно, это ведь не важно. Метод available всегда возвращает 0, как видно из исходного кода абстрактного класса InputStream.


Ну это просто уже смешно! :) Конечно, метод available() может вернуть и что-то другое, если его переопределить в наследнике класса InputStream.

Blazkowicz
InnateТолько я не вижу причин, почему сделано послабление, которое приводит к противоречию.
Ну, другие видят, раз формулировку сменили.


Видите ли их Вы? Если да, не могли бы поделиться?

Blazkowicz
InnateКакой источник данных вы можите предложить, Blazkowicz, который бы соответствовал тому, что написано в документации, но противоречил бы более строгому описанию.
Смотри Related Bugs. Спасибо Timm за оперативный поиск.

InnateДа, кстати в Release Notes я не нашел ничего про InputStream. Может дадите ссылку?
https://jdk6.dev.java.net/files/documents/5490/39025/jdk6-b45.html

Пока я нашел только баги, которые привели от спецификации версий 1.4.2 и 1.5.0 к спецификации версии 6.0. Так что проблема остается.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689415
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Innate
Пока я нашел только баги, которые привели от спецификации версий 1.4.2 и 1.5.0 к спецификации версии 6.0. Так что проблема остается.
(слишком многа букв в первом посте)
Какая проблема?
конец потока == available() = 0.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689452
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InnateДля Java это многое меняет.
Нет, не сюрприз! По-моему там прямо сказано, что, хоть метод и реализован, его необходимо переопределить в наследнике. Так что, как метод available() реализован в самом InputStream не столь важно. А важен его контракт и предпологаемое его поведение.
Ну это просто уже смешно! :) Конечно, метод available() может вернуть и что-то другое, если его переопределить в наследнике класса InputStream.

Ага. Судя по всему таки появилось понимание того что нельзя говорить об InputStream в отрыве от множества реализаций. Или нет?
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689579
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm Innate
Пока я нашел только баги, которые привели от спецификации версий 1.4.2 и 1.5.0 к спецификации версии 6.0. Так что проблема остается.
(слишком многа букв в первом посте)
Какая проблема?
конец потока == available() = 0.

Да. А в остальных случаях, что вернет available()? Наверное, не отрицательное число, а положительное. Вот и получается, что пока не достигнут конец потока, из него всегда можно считать по крайней мере один байт без блокировки, что не всегда правда.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689603
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz InnateДля Java это многое меняет.
Нет, не сюрприз! По-моему там прямо сказано, что, хоть метод и реализован, его необходимо переопределить в наследнике. Так что, как метод available() реализован в самом InputStream не столь важно. А важен его контракт и предпологаемое его поведение.
Ну это просто уже смешно! :) Конечно, метод available() может вернуть и что-то другое, если его переопределить в наследнике класса InputStream.

Ага. Судя по всему таки появилось понимание того что нельзя говорить об InputStream в отрыве от множества реализаций. Или нет?
Хотите Вы того или нет, но когда у Вас есть только ссылка типа InputStream, и Вы не знаете, объект какога типа она адресует в действительности, Вам ничего другого и не остается, кроме как говорить о InputStream, а не о его реализации.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689632
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Innate Timm Innate
Пока я нашел только баги, которые привели от спецификации версий 1.4.2 и 1.5.0 к спецификации версии 6.0. Так что проблема остается.
(слишком многа букв в первом посте)
Какая проблема?
конец потока == available() = 0.

Да. А в остальных случаях, что вернет available()? Наверное, не отрицательное число, а положительное. Вот и получается, что пока не достигнут конец потока, из него всегда можно считать по крайней мере один байт без блокировки, что не всегда правда.
Нет тут противоречия. Скорее всего имплементации available() таковы, что при вызове Available() поток будет блокирован до того момента как появится что то для чтения. последующий вызов read вычитает то что сможет, уже без блокирования.
т.е. да, available() всегда будет возвращать >=0 значение.
я так думаю.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689668
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm
Нет тут противоречия. Скорее всего имплементации available() таковы, что при вызове Available() поток будет блокирован до того момента как появится что то для чтения. последующий вызов read вычитает то что сможет, уже без блокирования.
т.е. да, available() всегда будет возвращать >=0 значение.
я так думаю.

Может и так, но ничего подобного в описании InputStream нет. Такая реализация available() практически безполезна. Пока приходится работать с тем, что есть...
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689767
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InnateДа. А в остальных случаях, что вернет available()? Наверное, не отрицательное число, а положительное. Вот и получается, что пока не достигнут конец потока, из него всегда можно считать по крайней мере один байт без блокировки, что не всегда правда.

Это не верное заключение. 0 возвращается в обоих случаях если конец файла и если нет данных для чтения без блокировки.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689790
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InnateХотите Вы того или нет, но когда у Вас есть только ссылка типа InputStream, и Вы не знаете, объект какога типа она адресует в действительности, Вам ничего другого и не остается, кроме как говорить о InputStream, а не о его реализации.
Хотите Вы того или нет всегда существует множество реализаций InputStream поведение которых влияет на документацию InputStream. Потому как создание слишком жестких рамок в спецификации InputStream вызовет проблемы с реализацией для некоторых протоколов. Посему спеуификация и послабляется, дабы дать шанс всем.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689799
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimmНет тут противоречия. Скорее всего имплементации available() таковы, что при вызове Available() поток будет блокирован до того момента как появится что то для чтения. последующий вызов read вычитает то что сможет, уже без блокирования.
т.е. да, available() всегда будет возвращать >=0 значение.
я так думаю.
Очень сильно сомневаюсь что available - блокирующая операция. Ведь этот метод создан именно для того чтобы была возможность избавиться от блокировок, тем самым повысив производительность.
К тому же это всего лишь изменения в документации. Можно с уверенностью сказать что оно не сильно затронуло существующие реализации.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689870
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
Это не верное заключение. 0 возвращается в обоих случаях если конец файла и если нет данных для чтения без блокировки.

Что возвращает нас к проблеме, описанной в первом посте. В любом случае, такое неоднозначное поведение совершенно неприемлемо.

Blazkowicz
Хотите Вы того или нет всегда существует множество реализаций InputStream поведение которых влияет на документацию InputStream. Потому как создание слишком жестких рамок в спецификации InputStream вызовет проблемы с реализацией для некоторых протоколов. Посему спеуификация и послабляется, дабы дать шанс всем.


Вот мне и интерестно, если ли реализации (или, скорее, примеры ситуаций), которые не допускают того, чтобы available() возвращал -1 по достижении конца потока, или нельзя было бы добавить isEndOfStrean(). Я пока не могу себе такое представить.

Blazkowicz
Ну, другие видят, раз формулировку сменили.


Может все-таки приведете пример ситуации, раз утверждаете это.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34689900
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz TimmНет тут противоречия. Скорее всего имплементации available() таковы, что при вызове Available() поток будет блокирован до того момента как появится что то для чтения. последующий вызов read вычитает то что сможет, уже без блокирования.
т.е. да, available() всегда будет возвращать >=0 значение.
я так думаю.
Очень сильно сомневаюсь что available - блокирующая операция. Ведь этот метод создан именно для того чтобы была возможность избавиться от блокировок, тем самым повысив производительность.
К тому же это всего лишь изменения в документации. Можно с уверенностью сказать что оно не сильно затронуло существующие реализации.
скажем так. в случае если реализация захочет - она будет блокироваться на available().
причем - блокироваться не для thread-safe'ности, а для того чтобы дождаться данных.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34690158
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Innate Blazkowicz
Это не верное заключение. 0 возвращается в обоих случаях если конец файла и если нет данных для чтения без блокировки.

Что возвращает нас к проблеме, описанной в первом посте. В любом случае, такое неоднозначное поведение совершенно неприемлемо.

Может быть оно и не приемлимо. Но сути это не меняет. Поменялась только документация! Она объясняет что 0 может вернуться не только когда не возможно чтение без блокировки, но и когда все данные из потока были вычитаны.


Innate
Вот мне и интерестно, если ли реализации (или, скорее, примеры ситуаций), которые не допускают того, чтобы available() возвращал -1 по достижении конца потока, или нельзя было бы добавить isEndOfStrean(). Я пока не могу себе такое представить.

Тут уже вопрос не в реализациях а в обратной совместимости. Если обязать InputStream.available()возвращать отрицательное значение, то сразу множество реализаций, о которых я пишу не первый раз, станут не валидными.

InnateМожет все-таки приведете пример ситуации, раз утверждаете это.
Мы тут про estimate или про конец файла?
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34690424
Stub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сантехники блин.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34690445
абырвалг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stubсантехники блин.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34692184
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Innate Blazkowicz
Это не верное заключение. 0 возвращается в обоих случаях если конец файла и если нет данных для чтения без блокировки.

Что возвращает нас к проблеме, описанной в первом посте. В любом случае, такое неоднозначное поведение совершенно неприемлемо.

Может быть оно и не приемлимо. Но сути это не меняет. Поменялась только документация! Она объясняет что 0 может вернуться не только когда не возможно чтение без блокировки, но и когда все данные из потока были вычитаны.


В этом месте разговор пошел по кругу...

Blazkowicz


Innate
Вот мне и интерестно, если ли реализации (или, скорее, примеры ситуаций), которые не допускают того, чтобы available() возвращал -1 по достижении конца потока, или нельзя было бы добавить isEndOfStream(). Я пока не могу себе такое представить.

Тут уже вопрос не в реализациях а в обратной совместимости. Если обязать InputStream.available()возвращать отрицательное значение, то сразу множество реализаций, о которых я пишу не первый раз, станут не валидными.



А до конца читать мы не хотим или не умеем, да? См. про isEndOfStream().

Blazkowicz

InnateМожет все-таки приведете пример ситуации, раз утверждаете это.
Мы тут про estimate или про конец файла?

Здесь я про пример ситуации, в которой принципиально невозможно различить, достигнут ли конец протока или просто доступные для чтения данные закончились. Какое-то физическое устроиство или другой источник данных, доступ к которому абстрогируется с помощью InputStream.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34692487
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Innate
В этом месте разговор пошел по кругу...

В этом месте разговор можно завершать. Вижу по сути ответить нечего.

Innate
А до конца читать мы не хотим или не умеем, да? См. про isEndOfStream().

Уважаемый, Вы зарываетесь. Побоку что поменять. Требование к available или добавить новый метод. Множество существующих реализаций InputStream станут не совместимыми с этими требованиями. Один из вариантов это ещё придется добавить метод isEndOfStreamDetectionSupported().

Вы кажется сами подзабыли о чем спрашивали в исходном топике. Про какие-то эксперименты с Java 6. А какие, к черту, эксперементы, если логика работы класса не менялась?


Innate
Здесь я про пример ситуации, в которой принципиально невозможно различить, достигнут ли конец протока или просто доступные для чтения данные закончились. Какое-то физическое устроиство или другой источник данных, доступ к которому абстрогируется с помощью InputStream.
Тю блин. Вот это уже точно разговор ни о чем. Ну допустим у меня есть девайсина с буфером. И я читаю из этого буфера, если там есть данные. Такая себе простецкая реализация. Может там данные уже и никогда не придут. Как мне конец потока определить?
Зачем что-то выдумывать, когда наши с Вами выдумки все равно не охватят нужное множество реализаций?
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34693324
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Innate
- извините за глупый вопрос, но не могли бы Вы объяснить в каких случаях (для каких задач) Вы планируете использовать метод available()
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34693596
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Innate

За определённые деньги я напишу для вас одну из реализаций InputStream для чтения потока файла с возможностью "смотреть вперёд". Вопросы согласованности/конкуренции/версионности буду игнорировать, как не имеющие значения для постановки.

Вас это устроит?
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34693624
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Innate
В этом месте разговор пошел по кругу...

В этом месте разговор можно завершать. Вижу по сути ответить нечего.


Зачем же Вам было повторять то, что было сказано Вами же выше? Получается, что Вам сказать-то
как раз и нечего.

Blazkowicz

Innate
А до конца читать мы не хотим или не умеем, да? См. про isEndOfStream().

Уважаемый, Вы зарываетесь. Побоку что поменять. Требование к available или добавить новый метод. Множество существующих реализаций InputStream станут не совместимыми с этими требованиями. Один из вариантов это ещё придется добавить метод isEndOfStreamDetectionSupported().


Согласен, что проблемы совместимости со старыми версиями остануться в обоих случаях.

Blazkowicz
Вы кажется сами подзабыли о чем спрашивали в исходном топике. Про какие-то эксперименты с Java 6. А какие, к черту, эксперементы, если логика работы класса не менялась?


Не кажется ли вам, что логика работы поменялать. В 1.4.2 и 1.5.0 никто не предлагает использовать available() для определения конца потока, в 6.0 это же это предусматривается, правда как-то неоднозначно. Вот и интересно, как работают хотя бы классы, которые Java API принадлежат.

Blazkowicz


Innate
Здесь я про пример ситуации, в которой принципиально невозможно различить, достигнут ли конец протока или просто доступные для чтения данные закончились. Какое-то физическое устроиство или другой источник данных, доступ к которому абстрогируется с помощью InputStream.
Тю блин. Вот это уже точно разговор ни о чем. Ну допустим у меня есть девайсина с буфером. И я читаю из этого буфера, если там есть данные. Такая себе простецкая реализация. Может там данные уже и никогда не придут. Как мне конец потока определить?
Зачем что-то выдумывать, когда наши с Вами выдумки все равно не охватят нужное множество реализаций?

Не кажется ли Вам, что здесь просто нет конца протока. Метод read() тоже никогда не вернет -1 в этом случае. А вот available() 0 вернуть может.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34693644
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov2 Innate
- извините за глупый вопрос, но не могли бы Вы объяснить в каких случаях (для каких задач) Вы планируете использовать метод available()

Да вроде цель, для которой был придуман available(), ясна. Для того, чтобы читать из потока (Stream) данные без блокировки; то есть пока читать нечего, нить (Thread) не блокируется, ожидая прихода данных, а может заняться чем-то другим, прериодически проверяя, с помощью метода available(), не проявилось ли что-то для чтения.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34693658
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton2 Innate

За определённые деньги я напишу для вас одну из реализаций InputStream для чтения потока файла с возможностью "смотреть вперёд". Вопросы согласованности/конкуренции/версионности буду игнорировать, как не имеющие значения для постановки.

Вас это устроит?

Да мне пока не надо. Но буду иметь вас в виду. :)
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34693792
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InnateНе кажется ли вам, что логика работы поменялать.
Нет не кажется.
InnateВ 1.4.2 и 1.5.0 никто не предлагает использовать available() для определения конца потока, в 6.0 это же это предусматривается, правда как-то неоднозначно.
Как раньше так и сейчас никто не предлагал использовать available для определения конца потока.
Как раньше так и сейчас available() возвращает 0 в обоих случаях - конец потока и не возможность чтения без блокировки.

InnateВот и интересно, как работают хотя бы классы, которые Java API принадлежат.
Как работали так и работают. Буфер пустой? available==0. Конец данных? available==0.

Предлагаю сойтись на почти полной бесполезности метода available.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34693939
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InnateДа вроде цель, для которой был придуман available(), ясна. Для того, чтобы читать из потока (Stream) данные без блокировки; то есть пока читать нечего, нить (Thread) не блокируется, ожидая прихода данных, а может заняться чем-то другим, прериодически проверяя, с помощью метода available(), не проявилось ли что-то для чтения.
- если необходимо чтобы Thread читал данные из потока и делал еще что-то, не означает ли это что необходимо два Thread-а, один из которых занимается чтением данных из потока (и его блокировка нас не волнует), а второй "делает еще что-то"? По моему, это классическая постановка задачи для написания многопоточного приложения.

- как Вы себе представляете "периодическую проверку" в общем потоке с чтением данных и выполнением "чего-то еще"? Без дополнительного потока не обойтись.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34693941
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz InnateНе кажется ли вам, что логика работы поменялать.
Нет не кажется.
InnateВ 1.4.2 и 1.5.0 никто не предлагает использовать available() для определения конца потока, в 6.0 это же это предусматривается, правда как-то неоднозначно.
Как раньше так и сейчас никто не предлагал использовать available для определения конца потока.
Как раньше так и сейчас available() возвращает 0 в обоих случаях - конец потока и не возможность чтения без блокировки.

InnateВот и интересно, как работают хотя бы классы, которые Java API принадлежат.
Как работали так и работают. Буфер пустой? available==0. Конец данных? available==0.

Предлагаю сойтись на почти полной бесполезности метода available.

Ок. Сошлись. :)
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34695111
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov- если необходимо чтобы Thread читал данные из потока и делал еще что-то, не означает ли это что необходимо два Thread-а, один из которых занимается чтением данных из потока (и его блокировка нас не волнует), а второй "делает еще что-то"? По моему, это классическая постановка задачи для написания многопоточного приложения.
- как Вы себе представляете "периодическую проверку" в общем потоке с чтением данных и выполнением "чего-то еще"? Без дополнительного потока не обойтись.
Показательный пример это задача чтения из большого количества потоков, данные на которые поступают крайне медленно. Для всех этих потоков имеет смысл завести ограниченое число нитей, которые будут их перебирать и вычитывать данные.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34695253
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
Показательный пример это задача чтения из большого количества потоков, данные на которые поступают крайне медленно. Для всех этих потоков имеет смысл завести ограниченое число нитей, которые будут их перебирать и вычитывать данные.
- все равно нужна дополнительная "контрольная" нить, "которая будет их перебирать", т. е. что бы ни говорил Innate о пользе метода available, а задачу надо решать путем создания многопочного приложения (с "контрольной нитью" или без нее это уже детали зависящие от планируемой нагрузки). А многопоточное приложение работающее с потоками данных это классика программирования на Java, такой пример разбирается в каждой книжке по Java :)
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34695272
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KachalovА многопоточное приложение работающее с потоками данных это классика программирования на Java, такой пример разбирается в каждой книжке по Java :)
Ну, так может многоуважаемый гуру подскажет нам название книжки и главу в которую смотреть?
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34695468
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНу, так может многоуважаемый гуру подскажет нам название книжки и главу в которую смотреть?
- не первый раз замечаю что Вы ко мне не ровно дышите (лично я себя "гуру" не считаю и встреваю в топики которые нтересны лично мне или где я, как мне кажется, могу быстро помочь человеку).

Blazkowicz - объясните причины личной неприязни, может мы с Вами встречались в "реале" (в Крыму я был неоднократно)? или это желание оставить последнее слово за собой (я на последнее слово не претендую - просто флуд раздражает)? или конкуренция в бизнесе? Не понимаю :(

На всякий случай, что бы прекратить дальнейший флуд, заявляю: единственный гуру на всех форумах по Java - это великолепный Blazkowicz.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34695519
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalovобъясните причины личной неприязни
Никакой лично не приязни. Просто не приятно, когда тебя пытаются отослать к "каждой книжке по Java", при этом, естественно, если перечислять "каждую книжку по Java", окажется что не в каждой. А может даже и вообще ни в одной. Вот и хотелось бы услышать о какой книжке речь. С примером многопоточного чтения без блокировок на методе read.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34695527
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov(лично я себя "гуру" не считаю и встреваю в топики которые нтересны лично мне или где я, как мне кажется, могу быстро помочь человеку).
Отсыл к "каждой книжке по Java" выдает в Вас гуру. Вы же всех их прочитали. Не скромничайте.
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34695695
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОтсыл к "каждой книжке по Java" выдает в Вас гуру. Вы же всех их прочитали. Не скромничайте.
По просьбам телезрителей:
Родли Джон "Создание Java-апплетов" "ДиаСофт Лтд." 1996г (ностальгия по апплетам)
стр. 178 глава "Ждать и уведомлять" (многопоточная загрузка большого количества картинок для апплета - тогда еще не было класса MediaTraker)

Джамса Крис "Библиотека программиста Java" "Попурри" 1997г
стр. 463 глава "Рассматриваем Two-Way Chat" (многопоточный сервер)

Чен М. "Программирование на Java: 1001 совет" "Попурри" 1997г
совет 845 (страницы не пронумерованы) "Реализация многопоточного сервера"
совет 846 "Почему клиенты должны быть многопоточными"

Вебер Д. "Технология Java в подлиннике" "BHV" 2000г
стр. 445 глава "Разработка сервера курса акций" (классический учебный многопоточный сервер)

Морган Майкл "Java 2. Руководство разработчика" "Вильямс" 2000г
стр. 439 глава "Использование клиентских и серверных объектов Socket" (учебный многопоточный сервер)

Второе издание Эккеля у меня увели (возможно там было то что нужно - не помню), а в третьем нет подходящего примера. Копаться в книгах типа Visual J++ (разных авторов) не стал. С какого то момента покупать книжки по основам программирования на Java перестал, так как не находил в них ничего нового, а полки не резиновые, хотя соблазн собрать коллекцию всего что выходит о Java был.

В приведенной библиографии указаны только книжки имеющие примеры связаные с темой топика, т. е. многопоточным сетевым взаимодействием.

Не могу сказать что я "прочитал все книжки по Java", но сказать что прочитал все книжки по основам программирования на Java на русском языке с 1996 года по 2000г могу :) но при этом отнюдь не считаю себя гуру Java-программирования, ведь Java это океан знаний и врядли найдется программист знающий Java одинаково хорошо во всех ее проявлениях (SE, EE, ME + чудесные фреймворки + и т. д.)
...
Рейтинг: 0 / 0
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
    #34702517
Innate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov Blazkowicz
Показательный пример это задача чтения из большого количества потоков, данные на которые поступают крайне медленно. Для всех этих потоков имеет смысл завести ограниченое число нитей, которые будут их перебирать и вычитывать данные.
- все равно нужна дополнительная "контрольная" нить, "которая будет их перебирать", т. е. что бы ни говорил Innate о пользе метода available, а задачу надо решать путем создания многопочного приложения (с "контрольной нитью" или без нее это уже детали зависящие от планируемой нагрузки). А многопоточное приложение работающее с потоками данных это классика программирования на Java, такой пример разбирается в каждой книжке по Java :)

Все это верно. Только с блокировками придется создавать отдельную нить для чтения каждого потока, чтобы обрабатывать данные как можно раньше после их появления в потоке, что при большом количестве потоков не является хорошей идеей.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]