Java Q: Ограничение стрима и строк по длине

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
MarkM
Пользователь
Сообщения: 113
Зарегистрирован: 24 сен 2003, 21:52

Java Q: Ограничение стрима и строк по длине

Сообщение MarkM »

Строки считываются из стрима (сокета). Две возможные проблемы. Враг может сунуть в стрим огромную строку, и/или много строк, что вызовет переполнение памяти сервера.

Усл1. Каждая строка должна быть считана не более заданной длины строки (ЗДС). То что считано более ЗДС - пропустить.
Усл2. Из стрима должно быть считано не более заданной длины чтения стрима (ЗДЧС). После считывания ЗДЧС - ресет стриму.

Искал в стандартных классах - не нашел как поставить ограничения или узнать количества считанного в стримах .

BufferedReader.readLine() читает до бесконца. Без ограничений на длину строки.
Стримы и Ридеры тоже не имеют ни ограничений ни полей вроде readCount.
Можно конечно считать в буфер а потом его сунуть в другой Стрим/Ридер. Но если ЗДЧС будет большой, то надо большой буфер создавать.

Как элегантно решить?
tasko
Графоман
Сообщения: 18705
Зарегистрирован: 20 июл 2003, 09:16
Откуда: Торонто

Сообщение tasko »

Я вообще-то яву знаю поверхностно. Но вот посмотрел в хелп BufferedReader, там есть на мой взгляд все необходимое.
Я бы следующую последовательность организовал:
1. mark(int readAheadLimit) - помечаем начало
2. read() - читаем посимвольно и одновременно считаем. Нашли конец строки? - откатываемся и читаем строку. Не нашли и достигли предела?
Делай, что считаешь нужным.
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

Я бы в этом случае не использовал бы Readers, а читал бы обычные InputStreams read-ми, и парсил их на строки сам, чекая все условия в процессе.
Кода всего на пол-экрана, зато полный контроль...
MarkM
Пользователь
Сообщения: 113
Зарегистрирован: 24 сен 2003, 21:52

Сообщение MarkM »

Marmot писал(а):Я бы в этом случае не использовал бы Readers, а читал бы обычные InputStreams read-ми, и парсил их на строки сам, чекая все условия в процессе.
Кода всего на пол-экрана, зато полный контроль...
Будут ли множественные однобайтные read-ы сколько нибудь существенно влиять на перформанс?
tasko
Графоман
Сообщения: 18705
Зарегистрирован: 20 июл 2003, 09:16
Откуда: Торонто

Сообщение tasko »

MarkM писал(а): Будут ли множественные однобайтные read-ы сколько нибудь существенно влиять на перформанс?
А икс его знает.
В С++ это работает мгновенно.
Аватара пользователя
Vitaliy-2000
Пользователь
Сообщения: 72
Зарегистрирован: 29 авг 2003, 03:27
Откуда: Москва-Торонто
Контактная информация:

Сообщение Vitaliy-2000 »

MarkM писал(а):
Marmot писал(а):Я бы в этом случае не использовал бы Readers, а читал бы обычные InputStreams read-ми, и парсил их на строки сам, чекая все условия в процессе.
Кода всего на пол-экрана, зато полный контроль...
Будут ли множественные однобайтные read-ы сколько нибудь существенно влиять на перформанс?
а зачем однобайтные?
читай в какой нибудь байтовый буффер приемлиемой для тебя длины
tasko
Графоман
Сообщения: 18705
Зарегистрирован: 20 июл 2003, 09:16
Откуда: Торонто

Сообщение tasko »

Vitaliy-2000 писал(а): а зачем однобайтные?
читай в какой нибудь байтовый буффер приемлиемой для тебя длины
Не очень элегантное решение. Он же читает из сокета. Может быть много байт, может быть мало. ПО-твоему решению, пока этот буфер не закачается, возврата в программу не произойдет. В том то и дело, что длина наперед неизвестна. Мелкие буферы - много возни. Большой буфер - долго ждать возврата.

Я бы все-таки побайтово читал. Самое безопасное.
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

MarkM писал(а):
Marmot писал(а):Я бы в этом случае не использовал бы Readers, а читал бы обычные InputStreams read-ми, и парсил их на строки сам, чекая все условия в процессе.
Кода всего на пол-экрана, зато полный контроль...
Будут ли множественные однобайтные read-ы сколько нибудь существенно влиять на перформанс?
Зачем однобайтные, читай в буфер среднего размера, 1К например, и скорость будет и памяти много не съешь...
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

tasko писал(а): Не очень элегантное решение. Он же читает из сокета. Может быть много байт, может быть мало. ПО-твоему решению, пока этот буфер не закачается, возврата в программу не произойдет.
Неправильно говоришь, API читай тщательнеЕ :-)
tasko
Графоман
Сообщения: 18705
Зарегистрирован: 20 июл 2003, 09:16
Откуда: Торонто

Сообщение tasko »

Marmot писал(а): Неправильно говоришь, API читай тщательнеЕ :-)
Ушел читать тщательнее...
:)
Ответить