【问题标题】:BufferedReader is stuck when output is empty输出为空时 BufferedReader 卡住
【发布时间】:2019-11-10 12:56:01
【问题描述】:

我使用 BufferedReader 来处理网页的输出。当网页的输出为空时(我在网页端使用Response.Clear),最后一行Log.e("status","finish")什么都不做。 reader.readLine() 是否被困在空输出中?如果是,在使用阅读器之前,我应该如何检查response是否为空?

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true); 
connection.setRequestProperty("Accept-Charset", "utf-8");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + "utf-8");
connection.connect(); // The code works same without this. Do I need this?
try (OutputStream output = connection.getOutputStream()) {
    output.write(query.getBytes("utf-8"));
    Log.e("status", "post Done"); // This works
}
InputStream response = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(response));

String line="";
while ((line = reader.readLine()) != null) {
    urlData += line;
}
reader.close();

Log.e("status","finish");

【问题讨论】:

    标签: android bufferedreader urlconnection


    【解决方案1】:

    是的,它被“卡住”了,虽然正确的措辞是“被阻止”。它会阻塞,直到收到一行文本。当套接字在对方关闭时,TCP 连接将指示终止并且输入流被关闭。此时,您将检索 API 指定的null。但是,在此之前,高级readLine 例程会很高兴地等到时间结束,或者直到下层产生超时。

    因此,如果您不相信您的服务器连接会返回任何数据,那么使用 readLine 甚至流式传输可能不是一个好主意。但是,您可以使用Socket.html#setSoTimeout(int) 将套接字设置为超时并生成异常 - 如果您认为服务器没有响应是一个异常问题。

    【讨论】:

    • 谢谢。除了readlinestream 之外,还有哪些其他方式可以使用连接输出?
    • 您可以使用AsynchronousSocketChannel。但是,如果您这样做,请为一些学习曲线做好准备。对于更高级别的目的,仅处理异常可能会更好。
    猜你喜欢
    • 2021-04-15
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2021-04-16
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多