安卓下载二进制文件问题

我在从互联网下载应用程序中的二进制文件(视频)时遇到问题。在Quicktime中,如果我直接下载它,它可以正常工作,但是通过我的应用程序,它会以某种方式变得混乱(即使它们在文本编辑器中看起来完全相同)。下面是一个示例:

    URL u = new URL("http://www.path.to/a.mp4?video");
    HttpURLConnection c = (HttpURLConnection) u.openConnection();
    c.setRequestMethod("GET");
    c.setDoOutput(true);
    c.connect();
    FileOutputStream f = new FileOutputStream(new File(root,"Video.mp4"));


    InputStream in = c.getInputStream();

    byte[] buffer = new byte[1024];
    int len1 = 0;
    while ( (len1 = in.read(buffer)) > 0 ) {
         f.write(buffer);
    }
    f.close();

答案 1

我不知道这是否是唯一的问题,但是你有一个经典的Java故障:你没有指望read()总是被允许返回比你要求的更少的字节。因此,您的读取可能小于 1024 个字节,但您的写入操作始终只写出 1024 个字节,可能包括上一个循环迭代中的字节。

更正为:

 while ( (len1 = in.read(buffer)) > 0 ) {
         f.write(buffer,0, len1);
 }

也许Android上3G的更高延迟网络或更小的数据包大小正在加剧这种影响?


答案 2
new DefaultHttpClient().execute(new HttpGet("http://www.path.to/a.mp4?video"))
        .getEntity().writeTo(
                new FileOutputStream(new File(root,"Video.mp4")));