InputStream不完全可读



为什么我不能阅读150k字符的邮报?我只能一直阅读〜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:如果我们忽略的是.available((,则代码在will中冻结:

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()));

没有例外。

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;
   }

最新更新