2011-03-24 51 views
1

我写了一段代码,它从文本文件中读取下载链接,并使用apaches commons-io库中的copyURLToFile方法下载视频,而当我在我的wlan中下载时真的很慢。 当我放入网络棒的速度是约6倍,虽然棒有4mbit和我的无线局域网是8兆位。 我也试过没有commons-io库,但问题是一样的。 通常我下载600-700 kb/s在我的无线局域网,但与Java它只下载约50 kb /秒。互联网坚持约300 kb/s。 你知道这个问题可能是什么吗?用java代码下载真的很慢

在此先感谢

//编辑:这里是代码,但我不认为这有什么关系这一点,你是什么意思与网络IT策略?

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); 
    } 
+5

您可以添加一个代码示例,我们可以帮助您吗? – 2011-03-24 16:44:52

+0

它可能与您的代码无关,并且与您的本地IT网络策略有关。 – 2011-03-24 16:48:16

+0

下载前是否有压缩文件的选项?可能它太大了。 – CoolBeans 2011-03-24 16:56:12

回答

1

这不太可能是Java问题。

您发布的代码实际上并没有通过网络进行任何IO操作 - 它只是确定一个URL并将其传递给(大概是Apache Commons的)FileUtils.copyURLToFile。像往常一样流行的第三方库,如果这种方法有一个错误,导致吞吐量在所有但最不寻常的情况下,它已经被确定(并希望修复)。

因此,这个问题将在别处。通过普通的HTTP方法(例如在浏览器中)访问资源时,你会获得预期的速度吗?如果不是,那么在操作系统级别存在一个普遍问题。否则,我会查看您网络上的政策。

两个可能的原因映入脑海:

  • 最明显的一个是某种流量整形 - 网络deprioritises来自您的Java应用程序包(一个可能是武断的原因)。你需要看到这个配置,并看看它的日志,看看是否是这种情况。
  • 问题在于DNS。如果Java使用阻塞或非常慢的主服务器,则可能需要几秒钟的时间才能将该URL转换为IP地址并开始实际传输。一旦防火墙将数据包丢弃到一台服务器,并且需要三秒(每次查找!),Java进程才会切换到辅助服务器,我也遇到了类似的问题。

无论如何,它几乎肯定是不是错误的Java代码。

+0

感谢您的答案流量整形的东西可能真的,但你有一个想法,我怎么可以修复这个谷歌目前没有真正帮助 – desibug 2011-03-24 17:15:11

+0

我也只是注意到,从这个网站的下载速度是在我的无线局域网约80 kb/s,并在我的互联网约380 kb/s,但在任何其他互联网网站我的无线局域网的速度高2倍 – desibug 2011-03-24 17:23:18

0

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

+0

我也尝试过写我自己的缓冲区,但它也不工作 – desibug 2011-03-24 18:02:57