我先给你一点背景:
我有一个类应该在套接字中写入一些查询,然后读取答案。这是应该从 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();
}
如果返回的结果是 OK,这个方法很好用,但是如果 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 因为流在缓冲区内没有要读取的更多数据,但是要从套接字读取更多数据。
那么,即使 Stream 需要一些时间来缓冲响应并且在期望输入时也不会阻塞,我如何才能使方法足够灵活以读取整个内容?
如果查询成功,我需要获得整个响应并关闭输入,这样它就不会阻塞,如果命令失败并且套接字期待任何输入。