我有一个servlet,它通过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));
}
效果很好。
那么在第一种情况下我哪里错了?
答案 0 :(得分:1)
使用InputStreamReader的方式实际上不是预期的方式。对read的调用不保证读取任何特定数量的字节(取决于您正在读取的流),这就是为什么此方法的返回值是读取的字节数。您需要继续从流中读取并缓冲,直到它指示它已到达结尾(它将返回-1作为读取的字节数)。有关如何执行此操作的一些很好的示例,请访问:Convert InputStream to byte array in Java
但是,由于您希望将其作为字符数据,因此您应该使用request.getReader()
。可以在此处找到如何执行此操作的一个很好的示例:Retrieving JSON Object Literal from HttpServletRequest