为什么我不能用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()));
没有例外。
答案 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;
}