【问题标题】:Speed Up download time加快下载时间
【发布时间】:2011-03-19 04:41:12
【问题描述】:

我在服务器中有 40 MB 的文件,我正在使用

下载我的文件
HttpURLConnection c = (HttpURLConnection) u.openConnection();
 c.setRequestMethod("GET");
 c.setDoOutput(true);
 c.connect();
 FileOutputStream f = new FileOutputStream(new File("trips.xml"));


 InputStream in = c.getInputStream();

 byte[] buffer = new byte[1024];
 int len1 = 0;
 while ( (len1 = in.read(buffer)) != -1 ) {
  f.write(buffer,0, len1);

此代码似乎运行良好,但花费的时间太长。他们有什么办法可以让这个过程更快。

/minhaz

【问题讨论】:

  • 您只能以最慢的连接速度下载。如果您使用拨号 (56K),则优化无关紧要。最慢的连接不一定是你 - 它不是与服务器的直接连接,请求会通过众多网络到达那里并返回。

标签: android io filereader


【解决方案1】:

使用大于 1 KB 的输入缓冲区。清空缓冲区的速度越快,网络堆栈继续下载的速度就越快。这应该会有所帮助:

byte[] buffer = new byte[50*1024];

【讨论】:

  • 这是提高下载速度的最简单方法;最初我使用的是 1kb 缓冲区,然后是 8kb,但后来我尝试了 50kb,它产生了显着差异。
  • 非常实用的解决方案
【解决方案2】:

这个非常丑陋的hack, 可能给你一个更快的下载时间,或者它可能没有,你必须在你的条件下测试它: p>

启动多个并行连接(在不同的线程中?),每个连接都应该下载不同的数据块(使用HTTP 1.1 Range header)。取决于许多事情,例如满月,太阳出来或玫瑰盛开,您可能会得到更好的结果,因为它比单个连接更好地使您的链接饱和(以其他所有人共享您的链接为代价,有点像BitTorrent 做什么)。

【讨论】:

  • 下载加速器和管理器通常是这样工作的。我不会称这是一个丑陋的黑客,我会称之为一个很好的解决方案;-)
  • @Chris 好的,我想那部分真的很主观。我会解决的。
  • @Gianni 我想从你应该与之共享​​>带宽的其他人的角度来看,这绝对是丑陋的......;-)
  • @Chris 我称之为丑陋的黑客的原因是,理论上,你应该相信网络会给你最好的结果;总是。这个东西起作用的原因是利用路由器和负载平衡器跨网络共享和限制对链接的使用。
  • 啊,我明白你来自哪里了。无论哪种方式,我认为您指定了一种更有效的解决方案。
【解决方案3】:

我有同样的问题,想出了这个代码。比我尝试过的以前的版本快。我指定的缓冲区大小大于我要下载的文件。希望对您有所帮助。

    public String load(String url, int bufferSize){

    try {
        URL myURL = new URL(url);
        URLConnection ucon = myURL.openConnection();
        ucon.setRequestProperty("Connection", "keep-alive");
        InputStream inputStream = ucon.getInputStream();
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(bufferSize);
        byte[] buf = new byte[bufferSize];
        int read;
        do {
            read = bufferedInputStream.read(buf, 0, buf.length);
            if (read > 0)
                byteArrayBuffer.append(buf, 0, read);
        } while (read >= 0);
        return new String(byteArrayBuffer.toByteArray());
    } catch (Exception e) {
        Log.i("Error", e.toString());
    }
    return null;
}

【讨论】:

  • 这是正确的,因为需要更大的缓冲区大小。但是,由于移动设备的内存限制,对于大于几兆字节的文件,应避免缓冲区大小大于文件大小。
猜你喜欢
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2014-05-14
  • 1970-01-01
相关资源
最近更新 更多