InputStream不完全可读

时间:2018-03-24 18:57:40

标签: java post inputstream bytearrayoutputstream

为什么我不能用150k字符读取POST请求? 我一次只能阅读~15k字符

InputStream is = socket.getInputStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();

while (is.available() > 0 && (length = is.read(buffer)) != -1) {
    baos.write(buffer, 0, length);
}

System.out.println(baos.toString(StandardCharsets.UTF_8.name()));

UPD:如果我们忽略了is.available(),代码会在while中冻结:

InputStream is = socket.getInputStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();

while ((length = is.read(buffer)) != -1) {
    baos.write(buffer, 0, length);
}

System.out.println(baos.toString(StandardCharsets.UTF_8.name()));

没有例外。

1 个答案:

答案 0 :(得分:0)

avaiable()的文档说:

  

可用的()   返回可以从此输入流中读取(或跳过)而不阻塞

的字节数估计值

所以我猜你内部有15k缓冲区,你只能读到自己缓冲区的末尾,而不是读到流的末尾。在这种情况下,您应该坦白地忽略availabe(),只需调用read( byte[] )直到它返回-1。

您更新的代码示例与我用于读取流的代码几乎完全相同。我认为问题必须在发件人方面。发件人未正确关闭流,或者存在一些不允许足够数据包通过的网络问题。

作为参考,这里是我用来读取整个流的代码。 (经过轻微测试。)

   public static ByteArrayOutputStream readFully( InputStream ins )
           throws IOException
   {
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      byte[] bytes = new byte[ 1024 ];
      for( int length; ( length = ins.read( bytes ) ) != -1; )
         bos.write( bytes, 0, length );
      return bos;
   }