У меня проблема с commons-net FTPClient. Если я загружу файл с моего ftp-сервера wirth retrieveFileStream(), он работает, но я получаю результат «150 Открытие соединения данных в режиме BINARY для ...». Если я вызову noop(), я получаю «226 Transfer complete» в качестве результата. Для каждой следующей операции я получаю результат отриной операции.commons-net FTPClient.retrieveFileStream() возвращает неверный результат
Я выяснил, что FTPClient читает результаты до конца строки, если есть две строки результата (как после retrieveFileStream()), я получаю второй после следующей команды. Я сделал обходной путь перекрывая FTPClient.retrieveFileStream(), как это:
public static void main(String[] args){
try {
MyFTPClient ftpClient = new MyFTPClient();
try {
ftpClient.connect(ftphost, 21);
if(!ftpClient.login(ftpuser, ftppassword)){
throw new RuntimeException(ftpClient.getReplyString());
}
if(!ftpClient.changeWorkingDirectory("in")){
throw new RuntimeException(ftpClient.getReplyString());
}
FTPFile[] files = ftpClient.listFiles();
for(FTPFile file: files){
if(file.getName().startsWith(FILENAME) && (file.getType() == FTPFile.FILE_TYPE)){
InputStream in = ftpClient.retrieveFileStream(file.getName());
CsvFile csvFile = new CsvFile(in, "ISO-8859-1", ';', "yyyyMMdd", "#.00", Locale.US, false);
in.close();
in = null;
System.out.println(ftpClient.getReplyString());
System.out.println(ftpClient.readLine());
System.out.println(ftpClient.rnfr(file.getName()));
System.out.println(ftpClient.getReplyString());
System.out.println(ftpClient.rnto("x" + file.getName()));
System.out.println(ftpClient.getReplyString());
}
}
if(!ftpClient.logout()){
throw new RuntimeException(ftpClient.getReplyString());
}
} finally {
ftpClient.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static class MyFTPClient extends FTPClient{
public String readLine(){
try {
__getReplyNoReport();
} catch (IOException e) {
}
return getReplyString();
}
}
Вызов метода ReadLine() получает мне дополнительную линию результата.
Но это ошибка FTPClient, или это проблема моего ftp-сервера? Проблема этого обходного пути заключается в том, что метод блокирует, если имеется только одна строка ответа.
Thanx за вашу помощь
Stephan
Ранний образец кода был неправильным, я заменил его. –
Иногда это помогает, читая руководство. Выполняется вызов completePendingCommand(). –
Вы должны опубликовать это как ответ и принять его. Все в порядке, чтобы ответить на ваши вопросы. –