2015-01-18 3 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를 사용하는 방식은 실제로 의도 된 방법이 아닙니다. read 호출은 특정 바이트 수를 읽는 것이 보장되지 않습니다 (읽는 스트림에 따라 다름). 따라서이 메서드의 반환 값은 읽은 바이트 수입니다. 스트림에서 읽기를 계속하고 버퍼가 끝까지 도달했음을 나타낼 때까지 버퍼링해야합니다 (읽은 바이트 수는 -1을 반환합니다). 이 작업을 수행하는 좋은 예가 여기에 있습니다. Convert InputStream to byte array in Java

그러나 문자 데이터로 사용하려면 request.getReader()을 사용해야합니다. 이렇게하는 방법에 대한 좋은 예가 여기에 있습니다. Retrieving JSON Object Literal from HttpServletRequest

관련 문제