循环和BufferedReader的问题

时间:2014-01-12 17:10:53

标签: java while-loop bufferedreader stringbuilder

我在循环中遇到一个奇怪的问题,即读取BufferedReader并且永远不会结束......

这是代码:

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

int b;
            StringBuilder buff = new StringBuilder();
            while ((b = in.read()) != -1 ) {
                buff.append((char) b);
            }
            System.out.println(buff.toString());

但永远不会到达最后一行来打印buff.toString()。 这段代码有什么问题吗?

感谢。

2 个答案:

答案 0 :(得分:0)

你可以尝试像这样改变while条件。

while ((b = in.read()) > -1 ) {
            buff.append((char) b);
        }

答案 1 :(得分:0)

你的循环试图读取直到EOF(这是输入流/阅读器为read()方法返回-1的唯一原因)。

问题是您的HTTP连接(和您的套接字)可能会保持打开状态(暂时),同时保持输入流/阅读器处于打开状态。因此,in.read()调用只会阻塞,等待输入,而不是达到循环的结束条件。

如果你控制连接的“另一面”,你可以关闭它,看看会发生什么。但我怀疑这对于一般的用例是否有用。相反,您需要根据HTTP协议解析消息(请参阅HTTP/1.1 RFC2616)。

如果您只需要解析标题,那么您可以使用BufferedReader,只读完整行,直到找到空行。这将起作用,因为HTTP在每个标题名称/值对之后使用换行符(在这种情况下为换行符为CRLF),并且使用恰好两个换行符结束标题部分。之后的一切都将成为信息的主体。

PS:这是一个简单/快乐的案例。请注意,单个连接/套接字可以重用于多个HTTP请求/响应。您也可以根据自己的要求处理此问题。