利用FTPfile.listfile()方法把现有文件夹文件队列化,但是目前文件夹中文件非常多,在执行此方法时经常进入假死状态,有什么优化的方法吗?代码如下:
            try
            {
                //读取文件
                FTPFile[] fileArray = null;
                //切换到source路径下
                
                boolean changedir = ftpc.changeWorkingDirectory(ftpserver.getPath());
    
                int j = 0;
                if (changedir) {
                    ftpc.setControlEncoding("utf-8");
                    fileArray = ftpc.listFiles();
                    for (int i = 0; i < fileArray.length; i++) {
                        String f = fileArray[i].getName();
                        if (fileArray[i].getName().equals(filenm)) {
                            j = i;
                        }
                    }
                }
                FTPFile file = fileArray[j];
                return file;
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return null;
            }

解决方案 »

  1.   

    FTPClent需要使用被动模式,在调用FTPClient.listFiles()或FTPClient.retrieveFile()这两个方法之前,调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,FTPClient告诉FTPServer开通一个端口来传输数据。为什么要这样做呢,因为FTPServer可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。
    这个试试
      

  2.   

    你好,是这样的,目前制定文件夹下的文件暂时还删除或者移动不了,而且数量级相当大。在执行上述代码之前,我能拿到文件名和目标路径,请问下FTPFile这个类,除了通过listFile返回list之后遍历初始化之外,有能通过绝对路径初始化的方法么?感谢大神
      

  3.   

    @LCL_data
    您好,感谢您的答复,您说的很有道理。这块分配端口和释放端口的问题,之前我们已经遇见并解决了,另 公司的文件服务器是Windows的。现在这个文件夹里的文件数量万甚至十万,只要一执行listFile就会假死,请问下有没有直接根据文件绝对路径初始化FTPFile的方法呢?感谢大神