Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java7中ftp上传速度慢_Java_Performance_Ftp - Fatal编程技术网

为什么Java7中ftp上传速度慢

为什么Java7中ftp上传速度慢,java,performance,ftp,Java,Performance,Ftp,我想问一下是否有人知道关于FTP的Java7问题?我使用了Sun Net和Apache Commons Net库,它们在Java 6上的性能与预期一致。但是,当我将我的开发环境(Eclipse)切换到1.7时,同样的操作执行得非常慢(大约4.5到8KB/s),这些操作都是针对本地主机服务器和局域网内的另一台服务器的 我尝试过缓冲流、字节到字节的传输、关闭Nagle算法,并使用Apache便利方法storeFile(),后者最终在本地主机上执行加速,但在远程服务器上再次减速为爬网。我还将所有机器设

我想问一下是否有人知道关于FTP的Java7问题?我使用了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'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();
            }
        }
可以看出,这是相当标准的实现代码。同样,在Java6中,事情进展得非常快。在Java7中,Sun和ApacheCommons库的速度都降低了10到20倍。使用像FileZilla这样的FTP客户机可以确认FTP功能正常,所以我认为它确实与Java7有关。我在网上尽可能多地搜寻任何关于问题的信息,但是,我看到的大部分是关于Java7和Windows7防火墙冲突的信息


提前感谢您提供的任何见解。

我找到了一种修复方法,至少足以让Java 7正常运行。我使用FTPClient的setBufferSize(0)实现了这一点不幸的是,我认为Sun的Java 7的Sun Net实现中没有类似的方法。这对我来说并不重要,因为我对ApacheCommonsNet非常满意。希望Oracle能在适当的时候找到问题的根源。

Commons Net 3.2存在一个已知的性能问题,该问题已在3.3快照中修复,您可以从这里获得:


虽然setBufferSize(0)似乎是一个有效的解决方法,但最好使用快照获得正确的修复-如果您对使用快照没有意见的话;)

请检查您当前的缓冲区大小:

ftpClient.getBufferSize();
如果尚未将其设置为其他值,则该值将为零(0)。 因此,将其设置为更高的值:

ftpClient.setBufferSize(1048576);//1024*1024
您可以像以前一样检查其当前值:

ftpClient.getBufferSize();

顺便说一句,被接受的答案,setBufferSize(0),对我不起作用。我使用的是最新版本的ApacheCommons,因此该解决方案可能适用于早期版本。如果将缓冲区大小设置为零,则当前版本不会有任何更改。

Q:“我认为它确实与Java 7有关”。我真的认为你可能是对的。尝试为Java6编译,并尝试在JRE6和JRE7上运行相同的.class。我敢打赌,你可能会证实你的理论:)数据的类别是什么??很抱歉,我错过了这个DWright。我尝试过从散列映射对象到字符串的任意数据类型,只是想看看这是否确实是原因,但它们都传输了相同的数据类型,即Java 6中的速度快,Java 7中的速度慢。您是否尝试过使用VisualVM分析来确定实际的方法?我正在设置它,但我也想跳到这里,看看这是否是一个已知的问题。谢谢,这为我解决了问题。知道为什么会这样吗?哇!我也遇到了同样的问题,添加ftpClient.setBufferSize(0)将一个文件的上载时间从117s减少到了6s!这就是我所说的在办公室的好日子!setBufferSize(0)在我的案例中不起作用。3.3版本的快照做到了。谢谢这对我帮助很大。谢谢谢谢我当时用的是3.2,你是对的,问题在3.3中得到了解决。将已接受的答案更改为您的答案。我在使用camel ftp时遇到了一些大文件加载的性能问题,这为我指明了正确的方向。谢谢