BufferedReader.readLine():如何在空数据时避免异常?

时间:2016-09-14 00:16:11

标签: java android httpurlconnection bufferedreader java-io

与HttpsURLConnection建立连接后,我读取了输入缓冲区。一切正常,但如果返回的数据为空(只有200字节,则为0字节) reader.readLine()引发IOException。 (编辑:它实际上是超时)

我可以在reader.readLine()之前写什么IF语句,所以我可以提前发现它?

注意:一个棘手的部分可能是我们仍然需要等待缓冲区接收到所有内容,因此IF需要“我们收到了所有内容,但没有任何内容。”

谢谢!

HttpsURLConnection connection = null;
BufferedReader reader = null;

try {
    URL url = new URL("https://example.com/GiveMeSomTextPlain");
    connection = (HttpsURLConnection) url.openConnection();
    connection.setConnectTimeout(9000);
    connection.setReadTimeout(11000);
    connection.connect();

    int resp = connection.getResponseCode();
    if (resp == 200) {

        reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

        // if( reader.ThereWillBeNoData() ){ // THIS IS WHAT I NEED
            // ...
        // }

        String line = "";
        while( ( line = reader.readLine() ) != null ){ // EXCEPTION IF EMPTY DATA
            // ...
        }

    }else{
        reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
    }

} catch (IOException e) {
    e.printStackTrace();
    // WE GET HERE AT EXCEPTION
} finally {
    if (connection != null) connection.disconnect();
    try {
        if (reader != null) reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

编辑:啊,似乎它在超时结束时(对应于我输入的11s)但“空”也是一个答案,那么如何避免超时? (见我的回应)

STACK TRACE:

09-13 18:39:40.134 20925-21658/com.theapp D/ZZZ: BEFORE WHILE
09-13 18:39:51.155 20925-21658/com.theapp W/System.err: java.net.SocketTimeoutException: Read timed out
09-13 18:39:51.155 20925-21658/com.theapp W/System.err:     at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
09-13 18:39:51.155 20925-21658/com.theapp W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:690)
09-13 18:39:51.155 20925-21658/com.theapp W/System.err:     at java.io.BufferedInputStream.read(BufferedInputStream.java:283)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err:     at com.android.okhttp.internal.http.UnknownLengthHttpInputStream.read(UnknownLengthHttpInputStream.java:39)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err:     at java.io.InputStreamReader.read(InputStreamReader.java:233)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err:     at java.io.BufferedReader.fillBuf(BufferedReader.java:145)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err:     at java.io.BufferedReader.readLine(BufferedReader.java:397)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err:     at com.theapp.Main.getMapData(Main.java:637)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err:     at com.theapp.Main$2$2.run(Main.java:231)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err:     at java.lang.Thread.run(Thread.java:841)
09-13 18:39:51.165 20925-21658/com.theapp D/ZZZ: EXCEPTION

1 个答案:

答案 0 :(得分:0)

问题原因:

没有数据时,服务器未发送内容长度。

这似乎是一个模棱两可的问题,因为在这种情况下是否应该发送Content-Length并不是很清楚。 Web浏览器很好地处理Content-Length的缺失,并且似乎假设它意味着0.但是,Android HttpsURLConnection没有,并且一直等到超时。我们可能会争辩说,没有数据应该是204 HTTP响应代码而不是200。

所以,如果有人遇到同样的问题:

  • 要么确保服务器在正文为空时发送Content-Length:0

  • 或者在这种情况下发送204。