为什么在java 7中ftp上传缓慢? [英] why is ftp upload slow in java 7

查看:421
本文介绍了为什么在java 7中ftp上传缓慢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想问问有没有人知道有关FTP的任何Java 7问题?我已经使用了Sun Net和Apache Commons Net库,都在Java 6上按预期执行。但是,当我将开发环境(Eclipse)切换到1.7时,相同的操作执行速度非常慢(大约4.5到8KB / s),这些都是本地主机服务器和局域网内的另一台服务器。



我尝试了缓冲流,字节到字节传输,关闭Nagle算法,并使用Apache便捷方法storeFile(),后者最终表现为加速本地主机,但又放慢速度以在远程服务器上进行爬网。我还设置了所有机器来关闭有状态的FTP过滤。

  InputStream is = null; 
OutputStream os = null;
try {
is = new BufferedInputStream(prepareInputStream(data));
os = new BufferedOutputStream(prepareOutputStream(data));
if(is == null || os == null){
log.error(Can not build connection);
return;
}

byte [] buf = new byte [4096];
int c = 1;

while(c> 0){
c = is.read(buf);
if(c> 0)
os.write(buf,0,c);
data.incrCurrentPosition();
fireStateChanged(data);
}
data.incrCurrentPosition();
} catch(IOException e){
log.error(e.getMessage(),e);
setEnabled(false);
} catch(Exception e){
log.error(e.getMessage(),e);
} finally {
if(is!= null){
try {
is.close();
} catch(IOException e){
e.printStackTrace();


if(os!= null){
try {
os.close();
} catch(IOException e){
e.printStackTrace();






$ b

可以看出,这是相当标准的实现代码。再次,在Java 6中,事情压缩得非常快。在Java 7中,Sun和Apache Commons库的速度减慢了10到20倍。使用像FileZilla这样的FTP客户端确认FTP运行正常,所以我认为它确实与Java 7有关。尽管我可以在网上找到有关问题的任何提及,但大部分情况下,我看到的内容都是关于Java 7和Windows 7防火墙发生冲突。



预先感谢您提供的任何见解。 解决方案

  ftpClient.getBufferSize(); 


如果您还没有将其设置为其他值,则该值为零(0)。
因此,将它设置为更高的值:

pre code> ftpClient.setBufferSize(1048576); // 1024 * 1024

您可以像以前一样检查当前值:

  ftpClient.getBufferSize(); 

顺便说一下,接受的答案 setBufferSize(0)不适合我。我使用最新版本的Apache commons,因此该解决方案可能适用于早期版本。如果将缓冲区大小设置为零,则当前版本不会发生变化。


I wanted to ask if anyone knows about any Java 7 issues with FTP? I've used both the Sun Net and Apache Commons Net libraries and both perform as expected on Java 6. But when I switch my dev environment (Eclipse) to 1.7, the same operations perform really slow (about 4.5 to 8KB/s), and these are to localhost servers and another server within the LAN.

I've tried buffered streams, byte-to-byte transfer, turning the Nagle Algorithm off, and using the Apache convenience method storeFile(), with the latter finally performing to speed on localhost but slowing down again to a crawl on a remote server. I also set all machines to turn off stateful FTP filtering.

    InputStream is = null;
    OutputStream os = null;
    try {
        is = new BufferedInputStream(prepareInputStream(data));
        os = new BufferedOutputStream(prepareOutputStream(data));
        if (is == null || os == null) {
            log.error("Can't build connection");
            return;
        }

        byte[] buf = new byte[4096];
        int c = 1;

        while (c > 0) {
            c = is.read(buf);
            if (c > 0)
            os.write(buf, 0, c);
            data.incrCurrentPosition();
            fireStateChanged(data);
        }
        data.incrCurrentPosition();
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        setEnabled(false);  
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

As can be seen, this is pretty standard implementation code. Again, in Java 6, things zip by really quick. In Java 7, it slows down by a factor of 10 to 20 for both the Sun and Apache Commons libraries. Using an FTP client like FileZilla confirms that FTP is functioning normally, so I think it really has something to do with Java 7. I dug as far as I could online for any mention of a problem but, mostly, the things I saw were about the Java 7 and Windows 7 firewall conflict.

Thanks in advance for any insight given.

解决方案

Please check what your current buffer size is with :

ftpClient.getBufferSize();

If you haven't already set it to something else, that will be zero (0). So, set it to a higher value :

ftpClient.setBufferSize(1048576);//1024*1024

You can check its current value as before :

ftpClient.getBufferSize();

By the way, the accepted answer, setBufferSize(0), did not work for me. I use the latest version of Apache commons, so probably that solution worked with earlier versions. If you set buffer size to zero, there will be no change with the current version.

这篇关于为什么在java 7中ftp上传缓慢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆