用java代码下载真的很慢

时间:2011-03-24 16:43:36

标签: java performance download

我写了一些代码,从文本文件中读取下载链接,并使用apaches commons-io库中的copyURLToFile方法下载视频,当我在我的wlan中时,下载速度非常慢。 当我放入一个互联网棒时,虽然棒有4mbit而且我的wlan是8 mbit,所以大约快了6倍。 我也尝试在没有commons-io库的情况下这样做,但问题是一样的。 通常我在我的wlan中下载600-700 kb / s但是使用java它只下载大约50 kb / s。随着互联网坚持其约300 kb / s。 你知道问题可能是什么吗?

提前致谢

//编辑:这是代码,但我不认为它与此有任何关系,你对网络政策有什么意义?

FileInputStream fstream = new FileInputStream(linksFile);
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    String link;
    String name;

    while ((link = br.readLine()) != null) {
        name = br.readLine();
        FileUtils.copyURLToFile(new URL(link), new File("videos/"+name+".flv"));;
        System.out.println(link);
    }

2 个答案:

答案 0 :(得分:1)

这不太可能是Java问题。

您发布的代码实际上并不通过网络执行任何IO - 它只是确定一个URL并将其传递给(可能是Apache Commons')FileUtils.copyURLToFile。像往常一样受欢迎的第三方库,如果这种方法中有一个错误导致除了最不寻常的情况之外的所有情况都会导致吞吐量缓慢,那么它已经被识别出来(并且希望已经修复)。

因此,问题将出现在其他地方。通过普通的HTTP方法(例如在浏览器中)访问资源时,您是否获得了预期的速度?如果没有,那么在操作系统级别存在普遍问题。否则,我会查看您网络上的政策。

有两种可能的原因让人想起:

  • 显而易见的是某种流量整形 - 您的网络优先处理来自Java应用程序的数据包(可能是出于任意原因)。您需要查看这个配置并查看其日志以查看是否是这种情况。
  • 问题在于DNS。如果Java使用的主服务器被阻止或速度非常慢,那么将该URL转换为IP地址并开始实际传输可能需要几秒钟的时间。当防火墙静默地将数据包丢弃到一台服务器时,我遇到了类似的问题,并且花了三秒钟(每次查找!),以便Java进程切换到辅助服务器。

在任何情况下,几乎肯定是而不是错误的Java代码。

答案 1 :(得分:0)

FileUtils.copyURLToFile内部使用缓冲区来读取。 增加缓冲区的值可以加快下载速度,但这似乎是不可能的。