2013-08-22 4 views
-1

Люди иногда используют BufferedReader для чтения данных сообщения.Почему люди используют BufferedReader для чтения данных по почте

BufferedReader bReader; 
    String postData = null; 
    try { 
     bReader = request.getReader(); 
     char[] buf = new char[1024]; 
     int len; 
     StringBuilder sBuilder = new StringBuilder(); 
     while ((len = bReader.read(buf)) != -1) { 
      sBuilder.append(buf, 0, len); 
     } 
     postData = sBuilder.toString(); 
    } catch (IOException e) { 
     bReader = null; 
    } 

Когда это следует использовать для получения параметра, как насчет request.getParameter()?

+0

Предлагаю обработать текст при его чтении, а не копировать данные из одного буфера, в другой буфер и обрабатывать их. Он более эффективен и делает код чище. –

ответ

4

Как отмечает EJP, этот подход используется, когда данные POST запроса содержат не что иное, как параметры запроса.

Итак ...

Когда я должен использовать это, чтобы получить параметр, как о request.getParameter()?

Вы можете использовать его, когда вы ожидает запрос POST тела, чтобы быть документом. Но это может быть недостаточно, как объясняется ниже.


Этот код не является особенно эффективным, и что он может быть проблематичным в других отношениях.

На стороне эффективности, код использует BufferedReaderИ чтения в большой (-ish) буфер символов перед передачей в StringBuilder.

  • Использование BufferedReader и char[] отчасти бессмысленно. Если вы собираетесь делать блок-чтения, лучше читать с базового Reader.

  • Чтение всех данных POST в StringBuilder (без ограничения его длины) может оставить вас открытыми для атак типа «отказ в обслуживании», направленных на запуск OOME. (Вы получите ту же проблему, если длинные запросы являются законными ...).

Есть также большие проблемы:

  • должен обрабатывать данные POST как поток символов, а пытается создать отдельную строку?

  • Правильно ли рассматривать данные POST как символы? (См. Заголовок Content-type.)

  • Используете ли вы правильную схему кодирования для декодирования символов? (См. Заголовок Content-type и т. Д.)

  • Если вы используете заголовок Content-length в качестве подсказки для определения размеров и/или соблюдения ограничений размера запроса.

Коротко говоря, код, о котором вы нас спрашиваете, выглядит слишком упрощенным, чтобы быть общим решением проблемы чтения данных POST.


Если пост стоимостных данных много памяти, она будет отправлена ​​на две части или больше?

Наверное, нет. Действительно, если вы (разработчик webapp) не реализуете схему, которая позволяет стороне клиента отправлять более мелкие куски, у клиента может не быть выбора, кроме как отправить один большой документ в данные POST. Конечно, в зависимости от того, что представляет собой документ и как его нужно обрабатывать, вы можете не нуждаться в, чтобы собрать его все в памяти. Другое дело, что вы не должны полагаться на то, что клиент «делает правильную вещь» в терминах того, что он вам отправляет. Ваш сервер должен защитить себя в какой-то момент.

+0

Очень хорошо, +1, но BufferedReader переносит прямо в целевой буфер при некоторых обстоятельствах, поэтому «(незначительно) лучше» не обязательно так. – EJP

+0

@ EJP - Маргинальное повышение эффективности включает в себя стоимость создания ненужного «BufferedReader». У Эрго есть разница во всех обстоятельствах. –

+0

Не в тему, но поздравляю с прошлым 200000 rep ':)' – Doorknob

0

Иногда данные POST не являются парами имя-значение. Иногда, например, это документ XML.

0

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

+0

Именно это я и хочу спросить. Если почтовые данные стоят много памяти, будет ли она отправляться на две части или более? –

+0

Если вы говорите о сумме нагрузки, которую имеет ArrayList, вы можете ограничить общее количество объектов String в arraylist, просто проверив размер, чтобы узнать, является ли это вашей определенной суммой, и если он удаляет первый индекс и продолжает добавлять каждый раз. –

Смежные вопросы