使用FTP连接时NullPointer

时间:2014-06-11 12:05:36

标签: java ftp

我使用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,代码将会很好地执行。有什么问题?

2 个答案:

答案 0 :(得分:1)

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

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

根据JavaDocthis question,您错过了一个步骤。

  

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

答案 1 :(得分:1)

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