【问题标题】:NullPointer while using FTP connection使用 FTP 连接时出现 NullPointer
【发布时间】:2014-06-11 12:05:36
【问题描述】:

我正在使用FTPClient 访问 ftp 服务器。我就是这样做的:

 public static void main(String[] args) {
        FTPClient ftpClient = new FTPClient();
        try {
            String SERVER = "10.67.192.18";
            String USER = "user";
            String PASS = "pass";
            String DIR = "/reports/ClientSessions/";
            ftpClient.connect(SERVER, 21);
            ftpClient.login(USER, PASS);
            ftpClient.enterLocalPassiveMode();
            ftpClient.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
            InputStream io1 = ftpClient.retrieveFileStream(DIR + "filename1.csv");
            System.out.println(io1);
            io1.close();
            InputStream io2 = ftpClient.retrieveFileStream(DIR + "filename1.csv");
            System.out.println(io2);
            io2.close();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {

                ftpClient.logout();
                ftpClient.disconnect();


            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

第二个InputStream 为空。如果我先评论InputStream,代码会执行得很好。怎么了?

【问题讨论】:

  • 文件似乎不存在或无法读取。见documentation
  • 451 Requested action aborted. Local error in processing
  • 我怀疑当您 close() 您的第一个 InputStream 时,您也在关闭 FTPClient 正在使用的底层连接内容。因此,您的第二个 InputStream 没有什么可指的。如果需要拉下多个文件,要么不要立即关闭流,要么对每个文件重新连接

标签: java ftp


【解决方案1】:

如官方文档中所述:http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#retrieveFileStream(java.lang.String) 表示如果未找到文件,则返回 null。 此外,InputStream 本身将负责在关闭父数据连接套接字时关闭。所以在关闭第一个InputStream 连接套接字后也关闭了。仅关闭 finally 块中的流。

【讨论】:

    【解决方案2】:

    每次都这样吗?根据维基百科的List of FTP Return Codes,“4xx 是一个瞬态否定完成回复......该命令未被接受并且请求的操作没有发生,但错误情况是暂时的,可能会再次请求该操作。”

    另外,csv 是否被视为二进制文件?尝试将类型设置为FTP.ASCII_FILE_TYPE

    根据JavaDocthis question,您缺少一个步骤。

    要完成文件传输,您必须调用 completePendingCommand 并检查其返回值以验证成功。

    【讨论】:

    • 不。仍然是 NullPointer。
    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多