HttpURLConnection读取输入流失败

时间:2011-09-29 03:33:20

标签: android

我的文件大小为5MB&想通过HttpURLConnection下载(目标就像" http://...../songs/Beatles_And I Love Her.mp3")。

我试图按照以下方式进行操作

URL url = new URL("http://........../songs/Beatles_And I Love Her.mp3");

URLConnection urlConnection = url.openConnection(); 
HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;

httpURLConnection.getResponseCode(); 
InputStream stream = httpURLConnection.getInputStream();

byte buf[] = new byte[128]; 
do 
{ 
    int numread = stream.read(buf); 
    if (numread <= 0)
    { 
        stream.close(); 
        break; 
    }
} while (true);

但问题是它只读取2KB到3KB的数据,然后返回-1并退出。

5 个答案:

答案 0 :(得分:1)

检查响应代码(应为200)并检查所获数据的内容。

我有类似的问题。原来这是我读过的服务器的错误页面,而不是正确的文件: - )

另外,请尝试使用 doesen&#t; 包含空格的文件(在服务器上重命名为Beatles_And_I_Love_Her.mp3)

答案 1 :(得分:1)

您只需在从中创建InputStream

之前调用以下内容即可
if(httpURLConnection.getResposecode==HTTPConnection.OK){
    // Do your job here
}else{
   //Error in connection creation
}

答案 2 :(得分:0)

试试这个对我有用

try{
            if(path != null && fileName != null){
                Log.v(TAG, "downloading data");

                URL url  = new URL(path + fileName);
                URLConnection conexion = url.openConnection();
                conexion.connect();

                int lenghtOfFile = conexion.getContentLength();
                Log.v(TAG, "lenghtOfFile = "+lenghtOfFile);

                InputStream is = url.openStream();

                File testDirectory = new File(Environment.getDataDirectory().toString() + "/data/" + c.getPackageName() + "/download");
                if(!testDirectory.exists()){
                    testDirectory.mkdir();
                }
                FileOutputStream fos = new FileOutputStream(testDirectory+"/" + fileName);
                byte data[] = new byte[1024];

                int count = 0;
                long total = 0;


                while ((count=is.read(data)) != -1) {
                    total += count;
                    int progress_temp = (int)(total * 100) / lenghtOfFile;
                    if((progress_temp % 10) == 0 && (progress != progress_temp)){
                        progress = progress_temp;
                        Log.v(TAG, "total = "+progress);    
                    }
                    fos.write(data, 0, count);
                }
                is.close();
                fos.close();
                Log.v(TAG, "downloading finished");
            }
        }catch(Exception e){
            Log.v(TAG, "exception in downloadData");
            e.printStackTrace();
        }

答案 3 :(得分:0)

增加缓冲区大小

byte buf[] = new byte[2048]; 

答案 4 :(得分:0)

更改

if (numread <= 0)

if (numread < 0)

正如the javadoc中所述,当你得到-1时,你应该只打破循环:

  

“读入缓冲区的总字节数,如果由于已到达流末尾而没有更多数据,则为-1。”

读取0字节有点奇怪,但可能会发生,因为数据已经在底层网络层的数据包中分割。