我使用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
,代码将会很好地执行。有什么问题?
答案 0 :(得分:1)
每次都会发生吗?根据维基百科的List of FTP Return Codes,“4xx是一个瞬态否定完成回复...该命令未被接受且请求的操作没有发生,但错误条件是暂时的,可能会再次请求操作。”< / p>
另外,csv被认为是二进制文件吗?尝试将类型设置为FTP.ASCII_FILE_TYPE
。
根据JavaDoc和this 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
块中的流。