【问题标题】:Server cannot read entire content服务器无法读取全部内容
【发布时间】:2015-03-16 14:47:54
【问题描述】:

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

效果很好。

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

【问题讨论】:

    标签: java servlets encoding http-post inputstream


    【解决方案1】:

    您使用 InputStreamReader 的方式并不是真正的预期方式。对 read 的调用不能保证读取任何特定数量的字节(它取决于您正在读取的流),这就是为什么此方法的返回值是已读取的字节数。您需要继续从流中读取并缓冲,直到它指示它已到达末尾(它将返回 -1 作为已读取的字节数)。可以在这里找到一些如何做到这一点的好例子:Convert InputStream to byte array in Java

    但由于您希望将其作为字符数据,您可能应该使用 request.getReader() 代替。一个很好的例子可以在这里找到:Retrieving JSON Object Literal from HttpServletRequest

    【讨论】:

      猜你喜欢
      • 2022-11-24
      • 2019-01-29
      • 2021-05-27
      • 1970-01-01
      • 2023-04-06
      • 2022-06-24
      • 1970-01-01
      • 2021-07-07
      • 2014-10-21
      相关资源
      最近更新 更多