5

我在服务器中有 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

4

3 回答 3

3

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

byte[] buffer = new byte[50*1024];
于 2010-07-21T21:03:44.113 回答
2

这个非常丑陋的黑客 可能会给你更快的下载时间,或者可能不会,你必须在你的条件下测试它:

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

于 2010-07-21T20:52:26.000 回答
1

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

    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;
}
于 2010-07-22T04:00:56.820 回答