2009-12-21 101 views
2

我面临与问题有关的Http连接。 我的代码:Http URL连接无法完全读取

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个字节

这里有什么问题?

请咨询家伙。

+0

你怎么知道它是13901字节?这是在HTTP内容长度标题中还是在查看您在磁盘上提供的文件? – Paolo 2009-12-21 08:50:31

+0

文档说明,当您到达流的末尾时返回-1,而不是0.即使有这种修复,我也认为Ramp的回复可能是您遇到问题的原因。 http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStreamReader.html#read%28char[],%20int,%20int%29 – rui 2009-12-21 09:53:39

+0

那么,InputStream是不允许的如果至少需要1个字节,则返回0,因此检查'if(count> 0)'实际上是否正确。 – StaxMan 2010-10-19 16:24:41

回答

3

我检查了你的代码,它似乎没问题。但是你必须记住你正在读取字符(2字节类型) - 所以你的readData.length()将显示字符数,而不是字节数。我做了一个测试,并将您的InputStreamReader更改为BufferedInputStream,并将缓冲区类型更改为byte []。代码完全读取我期望的字节数。
Regads!

+0

虽然有关字符转换的基本要点是有效的,但您对字符占用2个字节的评论通常不正确 - 只有UTF-16/UCS-2具有固定的每字节2字节编码,并且它们不常用网络服务器。 UTF-8是一种可变长度编码(每个Java字符1 - 3个字节); Latin-1每个字符固定1个字节,依此类推。 – StaxMan 2010-10-19 16:28:00

0

此外还要添加到接受的答案:我会考虑代码错误,因为它没有指定使用哪种字符编码InputStreamReader - 它是平台的默认值,它可能与资源使用的不同。因此,请始终指定编码以明确使用(“UTF-8”),或者使用执行此操作的库。