2015-01-18 2 views
0

У меня есть сервлет, который по методу POST получает большую строку JSON (> 10 000 символов).Сервер не может прочитать весь контент

Если я прочитал содержание запроса, как это:

try(Reader reader = new InputStreamReader(new BufferedInputStream(request.getInputStream()), StandardCharsets.UTF_8)) 
{ 
    char[] buffer = new char[request.getContentLength()]; 
    reader.read(buffer); 
    System.out.println(new String(buffer)); 
} 

Я не получить весь контент! Размер буфера правильный. Но длина созданной строки - нет.

Но если я делаю это так:

try(BufferedInputStream input = new BufferedInputStream(request.getInputStream())) 
{ 
    byte[] buffer = new byte[request.getContentLength()]; 
    input.read(buffer); 
    System.out.println(new String(buffer, StandardCharsets.UTF_8)); 
} 

она прекрасно работает.

Итак, где я ошибаюсь в первом случае?

ответ

1

Способ использования InputStreamReader на самом деле не предназначен. В запросе на чтение не гарантируется чтение какого-либо определенного количества байтов (это зависит от потока, который вы читаете), поэтому возвращаемое значение этого метода - это количество прочитанных байтов. Вам нужно будет продолжать чтение из потока и буферизации до тех пор, пока он не покажет, что он достиг конца (он вернет -1 как количество прочитанных байтов). Несколько хороших примеров того, как это сделать, можно найти здесь: Convert InputStream to byte array in Java

Но поскольку вы хотите, чтобы это как символьные данные, вы, вероятно, должны использовать вместо этого request.getReader(). Хороший пример того, как это сделать, можно найти здесь: Retrieving JSON Object Literal from HttpServletRequest

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