|
|
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Привет всем! Читал тут 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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 12:49:37 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
InnateМне интересно ваше мнение по этому поводу. Проводил ли кто-нибудь эксперименты, всегда ли доступны данные для чтения в версии 6.0? Блин, вот это 5. А не приходило в голову что InputStream это интерфейс с сотней реализаций. И данные могут качатся как из абсолютно разных источников? Именно поэтому такое послабление в документации и сделано. Надо ещё погуглировать или ReleaseNotes глянуть. Там будет более толковое объяснение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 13:11:33 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
InputStream, для начала, - это не интерфейс, а абстракный класс. Возможно, у него есть и сотня реализаций, я не считал. Только я не вижу причин, почему сделано послабление, которое приводит к противоречию. Какой источник данных вы можите предложить, Blazkowicz, который бы соответствовал тому, что написано в документации, но противоречил бы более строгому описанию. Да, кстати в Release Notes я не нашел ничего про InputStream. Может дадите ссылку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 13:37:28 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 13:51:39 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
InnateInputStream, для начала, - это не интерфейс, а абстракный класс. Ооо, это многое меняет. Может посмотрим как в этом абстрактном классе реализован метод available()? Код: plaintext 1. 2. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 14:08:31 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Спасибо, Timm, за ссылку. Итак, то, что я описал для версий 1.4.2, 1.5.0 в 6.0 постарались исправить. Только, по-моему, не лучшем образом. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4401029 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 14:12:35 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Blazkowicz InnateInputStream, для начала, - это не интерфейс, а абстракный класс. Ооо, это многое меняет. Для Java это многое меняет. Blazkowicz Может посмотрим как в этом абстрактном классе реализован метод available()? Код: plaintext 1. 2. Нет, не сюрприз! По-моему там прямо сказано, что, хоть метод и реализован, его необходимо переопределить в наследнике. Так что, как метод 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. Так что проблема остается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 14:33:31 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Innate Пока я нашел только баги, которые привели от спецификации версий 1.4.2 и 1.5.0 к спецификации версии 6.0. Так что проблема остается. (слишком многа букв в первом посте) Какая проблема? конец потока == available() = 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 15:14:25 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
InnateДля Java это многое меняет. Нет, не сюрприз! По-моему там прямо сказано, что, хоть метод и реализован, его необходимо переопределить в наследнике. Так что, как метод available() реализован в самом InputStream не столь важно. А важен его контракт и предпологаемое его поведение. Ну это просто уже смешно! :) Конечно, метод available() может вернуть и что-то другое, если его переопределить в наследнике класса InputStream. Ага. Судя по всему таки появилось понимание того что нельзя говорить об InputStream в отрыве от множества реализаций. Или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 15:21:20 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Timm Innate Пока я нашел только баги, которые привели от спецификации версий 1.4.2 и 1.5.0 к спецификации версии 6.0. Так что проблема остается. (слишком многа букв в первом посте) Какая проблема? конец потока == available() = 0. Да. А в остальных случаях, что вернет available()? Наверное, не отрицательное число, а положительное. Вот и получается, что пока не достигнут конец потока, из него всегда можно считать по крайней мере один байт без блокировки, что не всегда правда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 15:52:43 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Blazkowicz InnateДля Java это многое меняет. Нет, не сюрприз! По-моему там прямо сказано, что, хоть метод и реализован, его необходимо переопределить в наследнике. Так что, как метод available() реализован в самом InputStream не столь важно. А важен его контракт и предпологаемое его поведение. Ну это просто уже смешно! :) Конечно, метод available() может вернуть и что-то другое, если его переопределить в наследнике класса InputStream. Ага. Судя по всему таки появилось понимание того что нельзя говорить об InputStream в отрыве от множества реализаций. Или нет? Хотите Вы того или нет, но когда у Вас есть только ссылка типа InputStream, и Вы не знаете, объект какога типа она адресует в действительности, Вам ничего другого и не остается, кроме как говорить о InputStream, а не о его реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 15:58:03 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Innate Timm Innate Пока я нашел только баги, которые привели от спецификации версий 1.4.2 и 1.5.0 к спецификации версии 6.0. Так что проблема остается. (слишком многа букв в первом посте) Какая проблема? конец потока == available() = 0. Да. А в остальных случаях, что вернет available()? Наверное, не отрицательное число, а положительное. Вот и получается, что пока не достигнут конец потока, из него всегда можно считать по крайней мере один байт без блокировки, что не всегда правда. Нет тут противоречия. Скорее всего имплементации available() таковы, что при вызове Available() поток будет блокирован до того момента как появится что то для чтения. последующий вызов read вычитает то что сможет, уже без блокирования. т.е. да, available() всегда будет возвращать >=0 значение. я так думаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 16:06:28 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Timm Нет тут противоречия. Скорее всего имплементации available() таковы, что при вызове Available() поток будет блокирован до того момента как появится что то для чтения. последующий вызов read вычитает то что сможет, уже без блокирования. т.е. да, available() всегда будет возвращать >=0 значение. я так думаю. Может и так, но ничего подобного в описании InputStream нет. Такая реализация available() практически безполезна. Пока приходится работать с тем, что есть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 16:16:23 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
InnateДа. А в остальных случаях, что вернет available()? Наверное, не отрицательное число, а положительное. Вот и получается, что пока не достигнут конец потока, из него всегда можно считать по крайней мере один байт без блокировки, что не всегда правда. Это не верное заключение. 0 возвращается в обоих случаях если конец файла и если нет данных для чтения без блокировки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 16:38:07 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
InnateХотите Вы того или нет, но когда у Вас есть только ссылка типа InputStream, и Вы не знаете, объект какога типа она адресует в действительности, Вам ничего другого и не остается, кроме как говорить о InputStream, а не о его реализации. Хотите Вы того или нет всегда существует множество реализаций InputStream поведение которых влияет на документацию InputStream. Потому как создание слишком жестких рамок в спецификации InputStream вызовет проблемы с реализацией для некоторых протоколов. Посему спеуификация и послабляется, дабы дать шанс всем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 16:41:10 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
TimmНет тут противоречия. Скорее всего имплементации available() таковы, что при вызове Available() поток будет блокирован до того момента как появится что то для чтения. последующий вызов read вычитает то что сможет, уже без блокирования. т.е. да, available() всегда будет возвращать >=0 значение. я так думаю. Очень сильно сомневаюсь что available - блокирующая операция. Ведь этот метод создан именно для того чтобы была возможность избавиться от блокировок, тем самым повысив производительность. К тому же это всего лишь изменения в документации. Можно с уверенностью сказать что оно не сильно затронуло существующие реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 16:44:01 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Это не верное заключение. 0 возвращается в обоих случаях если конец файла и если нет данных для чтения без блокировки. Что возвращает нас к проблеме, описанной в первом посте. В любом случае, такое неоднозначное поведение совершенно неприемлемо. Blazkowicz Хотите Вы того или нет всегда существует множество реализаций InputStream поведение которых влияет на документацию InputStream. Потому как создание слишком жестких рамок в спецификации InputStream вызовет проблемы с реализацией для некоторых протоколов. Посему спеуификация и послабляется, дабы дать шанс всем. Вот мне и интерестно, если ли реализации (или, скорее, примеры ситуаций), которые не допускают того, чтобы available() возвращал -1 по достижении конца потока, или нельзя было бы добавить isEndOfStrean(). Я пока не могу себе такое представить. Blazkowicz Ну, другие видят, раз формулировку сменили. Может все-таки приведете пример ситуации, раз утверждаете это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 16:58:37 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Blazkowicz TimmНет тут противоречия. Скорее всего имплементации available() таковы, что при вызове Available() поток будет блокирован до того момента как появится что то для чтения. последующий вызов read вычитает то что сможет, уже без блокирования. т.е. да, available() всегда будет возвращать >=0 значение. я так думаю. Очень сильно сомневаюсь что available - блокирующая операция. Ведь этот метод создан именно для того чтобы была возможность избавиться от блокировок, тем самым повысив производительность. К тому же это всего лишь изменения в документации. Можно с уверенностью сказать что оно не сильно затронуло существующие реализации. скажем так. в случае если реализация захочет - она будет блокироваться на available(). причем - блокироваться не для thread-safe'ности, а для того чтобы дождаться данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 17:05:13 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Innate Blazkowicz Это не верное заключение. 0 возвращается в обоих случаях если конец файла и если нет данных для чтения без блокировки. Что возвращает нас к проблеме, описанной в первом посте. В любом случае, такое неоднозначное поведение совершенно неприемлемо. Может быть оно и не приемлимо. Но сути это не меняет. Поменялась только документация! Она объясняет что 0 может вернуться не только когда не возможно чтение без блокировки, но и когда все данные из потока были вычитаны. Innate Вот мне и интерестно, если ли реализации (или, скорее, примеры ситуаций), которые не допускают того, чтобы available() возвращал -1 по достижении конца потока, или нельзя было бы добавить isEndOfStrean(). Я пока не могу себе такое представить. Тут уже вопрос не в реализациях а в обратной совместимости. Если обязать InputStream.available()возвращать отрицательное значение, то сразу множество реализаций, о которых я пишу не первый раз, станут не валидными. InnateМожет все-таки приведете пример ситуации, раз утверждаете это. Мы тут про estimate или про конец файла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 18:34:30 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
сантехники блин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 23:24:24 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Stubсантехники блин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2007, 00:02:43 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Innate Blazkowicz Это не верное заключение. 0 возвращается в обоих случаях если конец файла и если нет данных для чтения без блокировки. Что возвращает нас к проблеме, описанной в первом посте. В любом случае, такое неоднозначное поведение совершенно неприемлемо. Может быть оно и не приемлимо. Но сути это не меняет. Поменялась только документация! Она объясняет что 0 может вернуться не только когда не возможно чтение без блокировки, но и когда все данные из потока были вычитаны. В этом месте разговор пошел по кругу... Blazkowicz Innate Вот мне и интерестно, если ли реализации (или, скорее, примеры ситуаций), которые не допускают того, чтобы available() возвращал -1 по достижении конца потока, или нельзя было бы добавить isEndOfStream(). Я пока не могу себе такое представить. Тут уже вопрос не в реализациях а в обратной совместимости. Если обязать InputStream.available()возвращать отрицательное значение, то сразу множество реализаций, о которых я пишу не первый раз, станут не валидными. А до конца читать мы не хотим или не умеем, да? См. про isEndOfStream(). Blazkowicz InnateМожет все-таки приведете пример ситуации, раз утверждаете это. Мы тут про estimate или про конец файла? Здесь я про пример ситуации, в которой принципиально невозможно различить, достигнут ли конец протока или просто доступные для чтения данные закончились. Какое-то физическое устроиство или другой источник данных, доступ к которому абстрогируется с помощью InputStream. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 12:02:41 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
Innate В этом месте разговор пошел по кругу... В этом месте разговор можно завершать. Вижу по сути ответить нечего. Innate А до конца читать мы не хотим или не умеем, да? См. про isEndOfStream(). Уважаемый, Вы зарываетесь. Побоку что поменять. Требование к available или добавить новый метод. Множество существующих реализаций InputStream станут не совместимыми с этими требованиями. Один из вариантов это ещё придется добавить метод isEndOfStreamDetectionSupported(). Вы кажется сами подзабыли о чем спрашивали в исходном топике. Про какие-то эксперименты с Java 6. А какие, к черту, эксперементы, если логика работы класса не менялась? Innate Здесь я про пример ситуации, в которой принципиально невозможно различить, достигнут ли конец протока или просто доступные для чтения данные закончились. Какое-то физическое устроиство или другой источник данных, доступ к которому абстрогируется с помощью InputStream. Тю блин. Вот это уже точно разговор ни о чем. Ну допустим у меня есть девайсина с буфером. И я читаю из этого буфера, если там есть данные. Такая себе простецкая реализация. Может там данные уже и никогда не придут. Как мне конец потока определить? Зачем что-то выдумывать, когда наши с Вами выдумки все равно не охватят нужное множество реализаций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 13:11:40 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
2 Innate - извините за глупый вопрос, но не могли бы Вы объяснить в каких случаях (для каких задач) Вы планируете использовать метод available() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 16:16:56 |
|
||
|
InputStream, сравнение версий 1.4.2, 1.5.0, 6.0
|
|||
|---|---|---|---|
|
#18+
2 Innate За определённые деньги я напишу для вас одну из реализаций InputStream для чтения потока файла с возможностью "смотреть вперёд". Вопросы согласованности/конкуренции/версионности буду игнорировать, как не имеющие значения для постановки. Вас это устроит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 17:25:10 |
|
||
|
|

start [/forum/topic.php?fid=59&tid=2144999]: |
0ms |
get settings: |
8ms |
get forum list: |
37ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 312ms |
| total: | 481ms |

| 0 / 0 |
