服务器无法读取整个内容

时间:2015-01-18 13:46:49

标签: java servlets encoding http-post inputstream

我有一个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));
}

效果很好。

那么在第一种情况下我哪里错了?

1 个答案:

答案 0 :(得分:1)

使用InputStreamReader的方式实际上不是预期的方式。对read的调用不保证读取任何特定数量的字节(取决于您正在读取的流),这就是为什么此方法的返回值是读取的字节数。您需要继续从流中读取并缓冲,直到它指示它已到达结尾(它将返回-1作为读取的字节数)。有关如何执行此操作的一些很好的示例,请访问:Convert InputStream to byte array in Java

但是,由于您希望将其作为字符数据,因此您应该使用request.getReader()。可以在此处找到如何执行此操作的一个很好的示例:Retrieving JSON Object Literal from HttpServletRequest