有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java FTPClient在有文件时显示空文件夹

我正在使用ApacheCommonsNetFTPClient登录并从FTP服务器读取文件。我成功登录,并且可以看到它成功登录,因为它在标题字符串中显示了工作目录路径。但是,当我使用listFiles()时,它不显示任何文件。(我也尝试过使用listDirectories()listNames(),但没有成功) 下面是一个片段:

try {
        client.connect(ftpHost);
    } /*catch (SocketException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }*/ catch (IOException ex) {
        // TODO Auto-generated catch block
        ex.printStackTrace();
    }


    String header ="";
    InputStream stream=null;
    BufferedReader reader=null;
    try{
        client.login(ftpUser, ftpPass);
        client.changeWorkingDirectory(targetWorkingDir);
        header = client.printWorkingDirectory();
        //client.setFileType(FTP.BINARY_FILE_TYPE);
        for(int i=0; i<client.listFiles().length;i++){
            header+=client.listFiles()[i].getName() +"\n";
        }

    }
    catch (IOException ex){
        ex.printStackTrace();
        header="ERROR 1: " + ex.getMessage();
        for(int i=0;i<ex.getStackTrace().length;i++){
            header += "\n" + ex.getStackTrace()[i];
        }
    }
    catch(NullPointerException e){
        header = "ERROR 2: "+ e.getMessage()+"\n";
        for(int i=0;i<e.getStackTrace().length;i++){
            header+= e.getStackTrace()[i] + "\n";
        }
    }
    finally{
        if(reader!=null){
            try{reader.close();}catch(IOException e){e.printStackTrace();}
            try{stream.close();}catch(IOException e){e.printStackTrace();}
        }
    }

我也尝试过使用类似的方法来读取文件:

try {
    stream = ftpClient.retrieveFileStream("klasa.csv");
    reader = new BufferedReader(new InputStreamReader(stream));
    header = reader.readLine();
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore){}
}

在这两种情况下,我都非常确定自己在正确的目录下,并且通过FileZilla确保我的文件在那里,但是客户端似乎无法读取任何文件


共 (1) 个答案

  1. # 1 楼答案

    尽量避免在循环中调用listFiles()。每个调用都将执行整个FTP LIST命令序列,因此最终,您将为每个调用添加不必要的通信量

    您可以尝试先简化程序,如下所示:

    private static  void ftpTest() {
        FTPClient f = new FTPClient();
        try {
            f.connect("{UOUR FTP SERVER}");
            f.login("{USER}", "{PASSWORD}");
            FTPFile[] files = f.listFiles(".");
            for (FTPFile fi: files) {
                System.out.printf("f%s\n", fi.getName());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    如果此程序不会提供服务器根目录中的文件列表,则可以尝试比较FileZilla FTP选项(尤其是被动/主动模式):https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode()

    如果没有帮助,您可以尝试使用WireShark或tcpdump嗅探网络流量,并将命令集与FTP服务器进行比较