Android Http URL连接可以';我不能完全阅读

Android Http URL连接可以';我不能完全阅读,android,Android,我面临与Http连接相关的问题。 我的代码: URL url = null; try { url = new URL(_url); } catch (MalformedURLException e) { } if (url != null) { HttpURLConnection urlConn = null; InputStreamReader isr = null; try { urlConn = (HttpURLConnection)url

我面临与Http连接相关的问题。 我的代码:

URL url = null;
try {
    url = new URL(_url);
} catch (MalformedURLException e) {
}

if (url != null) {
    HttpURLConnection urlConn = null;
    InputStreamReader isr = null;
    try {
        urlConn = (HttpURLConnection)url.openConnection();
        urlConn.setRequestMethod("GET");
        urlConn.setConnectTimeout(45000);

        if(response == HttpURLConnection.HTTP_OK) {
            StringBuffer readData = new StringBuffer("");
            int size = 1024;
            char[] buffer = new char[size];
            int len;
            isr = new InputStreamReader(urlConn.getInputStream());
            while ((len = isr.read(buffer, 0, size)) > 0) {
                readData.append(buffer, 0, len);
            }
        }
    } 
    catch(Exception e) {
    } 
    finally {
        if(urlConn != null) {

        try {
            urlConn.disconnect();
        } catch(Exception e) {            
        }
    }
    if(isr != null) {
        try {
           isr.close();
        } catch(Exception e) {                
        }            
    }
}
此代码无法完全下载数据。 例如: 要读取的总大小:13901字节 以上代码可以读取大小:12937字节

这里怎么了


请给大家提建议。

我已经检查了你的代码,看起来还可以。但您必须记住,您正在读取字符(2字节类型),因此readData.length()将显示字符数,而不是字节数。我做了一个测试,将您的InputStreamReader更改为BufferedInputStream,将缓冲区类型更改为byte[]。代码读取的字节数与我预期的完全相同。

雷加斯

> P>也要补充一个公认的答案:我会考虑代码Bugy,因为它没有指定InputStreamReader使用什么字符——它是平台默认值,这可能与资源使用的情况不同。因此,请始终指定要显式使用的编码(“UTF-8”),或使用执行此操作的库。

您如何知道它是13901字节?这是在HTTP内容长度头中,还是正在查看磁盘上提供服务的文件?文档说明,在到达流末尾时返回-1,而不是0。即使有了这个修正,我认为Ramp的回答可能是您遇到问题的原因。嗯,如果请求了至少1个字节,则InputStream不允许返回0,因此检查“if(count>0)”实际上是可以的。虽然有关字符转换的基本点是有效的,但您对字符获取2字节的评论通常是不正确的——只有UTF-16/UCS-2具有固定的每字符2字节编码,而且它们并不常用于web服务器。UTF-8是一种可变长度编码(每个Java字符1-3字节);拉丁语-1是固定的每个字符1字节,依此类推。