BufferedReader 在输出为空时卡住

BufferedReader is stuck when output is empty

我使用 BufferedReader 来处理网页的输出。当网页输出为空时(我在web端使用Response.Clear),最后一行Log.e("status","finish")什么都不做。 reader.readLine() 是否卡在空输出中?如果是,我应该如何在使用 reader 之前检查 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");

是的,它是 "stucked",虽然正确的措辞是 "blocked"。它会阻塞,直到收到一行文本。当套接字在另一方关闭时,TCP 连接将指示终止并且输入流将关闭。届时,您将检索 API 指定的 null。然而,在此之前,高层 readLine 例程将愉快地等待直到时间结束,或者直到较低层产生超时。

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