为什么我不能阅读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;
}