我先给你一点上下文:
我有一个类应该在socket中编写一些查询,然后阅读答案。 这是应该从inputStream中读取的代码:
private String getDataFromInputStream() throws IOException
{
StringBuilder sb = new StringBuilder();
InputStream stream = this.socket.getInputStream();
byte[] buff = new byte[1024];
int bytesRead = 0;
while(bytesRead >= 0)
{
bytesRead = stream.read(buff);
if (bytesRead > 0) sb.append(new String(buff, 0, bytesRead));
}
return sb.toString();
}
如果返回的结果没问题,这个方法效果很好,但是如果出于某种原因,InputStream.read一直在等待输入,当然还有块。
所以我将代码更改为此代码:
private String getDataFromInputStream() throws IOException
{
StringBuilder sb = new StringBuilder();
InputStream stream = this.socket.getInputStream();
byte[] buff = new byte[1024];
int bytesRead = 0;
while(stream.available() > 0)
{
bytesRead = stream.read(buff);
if (bytesRead > 0) sb.append(new String(buff, 0, bytesRead));
}
return sb.toString();
}
但是这里出现了新问题:第二段代码并未读取整个回复。它只返回完整响应的片段。
我知道available()方法返回0,因为流没有更多的数据要在缓冲区内读取,但是有更多的数据需要从套接字中读取。
那么,即使需要一些时间来缓冲响应,并且在预期输入时也不会阻塞,我怎样才能使方法灵活地读取整个事物呢?
如果查询成功,我需要获取整个响应并关闭输入,以便在命令失败且套接字期望任何输入时不会阻塞。