![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Почему вот такой код:
выдаёт первую же введённую короткую строку сразу после ENTER? Ведь по умолчанию длина буфера BufferedReader составляет 8192 символов, почему же она их не буферизует? Это сообщение отредактировал(а) Dims - 19.9.2009, 08:26 |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
А если ты у BufferedReader-а вызовешь метод чтения одного символа, он что по твоему должен вернуть?
BufferedReader работает следующим образом: он читает из нижележащего Reader-а в свой внутренний буфер. При чтении из BufferedReader-а он вначале выдает данные из своего внутреннего буфера, а когда они там заканчиваются снова читает данные из нижележащего Reader-а в свой внутренний буфер. При этом количество данных которые вернет BufferedReader не зависит от размера его внутреннего буфера, оно зависит только от того какой метод ты вызвал и сколько данных есть в нижележащем Reader-е. -------------------- 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. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Если буфер пуст, то сколько данных BufferedReader считывает из нижележащего Reader-а? Добавлено через 3 минуты и 37 секунд
Ты не понял. Вопрос не в том, что он должен вернуть. А в том, что он должен взять. Возвращают все методы то, что написано в мануале. Если 1 символ, то 1 символ, а если 1 строку, то 1 строку. Но при этом иногда он из нижележащего ридера читает много строк, а иногда одну. Вот в этом и вопрос. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Пытается полностью заполнить внутренний буфер, но сколько реально будет прочитано данных зависит от нижележащего Reader-а. -------------------- 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. |
|||
|
||||
| Dims |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Я написал вот такой класс:
и при той же самой программе:
получил вот такую выдачу:
То есть, здесь видно, что программа сперва прочитала много строк в буфер, а потом только вернулась из readLine. Добавлено через 46 секунд
Каким образом зависит? Как нижестоящий Ридер может повлиять на это? |
||||||||
|
|||||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Метод
возвращает число символов которое было реально прочитано. Сколько байт будет прочитано предсказать заранее нельзя. Данные могут просто закончится, могут еще не придти (если идет чтение по сети) и т.д., все зависит от реализации Reader-а и того откуда он берет данные. В твоем примере реализация метода read(byte[], int, int) из класса InputStream будет вызывать твой read() до тех пор пока не будет прочитанно нужное количество байт или пока метод не вернет -1 (что означает конец потока). -------------------- 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. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Как ты приходишь к такому выводу? Почему в случае с System.in работает не так? |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Разобрался.
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Открываю исходники JDK и смотрю код -------------------- 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. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Да, пришлось читать исходники. Интересно, что в данном случае из документации почерпнуть правильную информацию затруднительно.
|
|||
|
||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Вся необходимая информация в документации есть, просто надо читать внимательней.
-------------------- 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. |
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Ну если достаточно внимательно читать документацию, зачем же тогда ты сам залез в исходники почитать код? ;)
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Я делаю то, что проще/быстрее в данный момент.
Конечно исходники дадут больше информации, как все устроенно внутри и как оно работает. Но утверждать что в документации недостаточно информации для реализации своего InputStream - нельзя. Тем более что, читать документацию нужно обязательно дабы знать контракт. -------------------- 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. |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Это теория. В данном случае в контракте не написано, КАК именно я должен реализовывать read(массивы). "Эффективно" -- это слишком общий термин.
На мой взгляд, неполно составлен контракт BufferedReader в т.ч. readLine. Там должно было быть написано, что сперва для заполнения буфера используется read(массивы). |
|||
|
||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Ты не понимаешь. Во первых контракт это описание что должна делать функция, но ни в коем случае не описание как она это должна делать. Даже если в документации и есть некие советы по реализации, то частью контракта они не являются. Во вторых как ты себе представляешь дать конкретный совет по реализации метода чтения данных из неизвестного источника?
1. Да все там нормально, если почитать описание класса BufferedReader, то его поведение становится очевидным. 2. То что какой-то аспект не описан, значит он не является частью контракта и implementation specific. Ты прицепился к своему примеру и не хочешь взглянуть на проблему шире, тот же readLine() может обращаться к нижележащему потоку неограниченное количество раз (если строка длинная а данные приходят малыми порциями). Для нормальной работы с BufferedReader эта информация - не нужна. -------------------- 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. |
||||
|
|||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |