В настоящее время я использую библиотеку commons-net для клиента FTP в моем приложении.Я должен загрузить с удаленного сервера некоторые файлы, по некоторым критериям, основанным на имени файла.Это очень упрощенная и сокращенная версия моего реального кода (потому что я делаю некоторые проверки и ловлю все возможные исключения), но суть здесь есть:
//ftp is FTPClient object
//...
files = ftp.listFiles();
for (FTPFile ftpFile : files) {
String name = ftpFile.getName();
if(conformsCriteria(name)) {
String path = outDirectory + File.separatorChar + name;
os = new FileOutputStream(path);
ftp.retrieveFile(name, os);
}
}
Теперь я заметил, что при запускеэтот код, подождите несколько секунд, а затем подключите сетевой кабель, выходной каталог содержит некоторые «пустые» файлы плюс фактически загруженные файлы, что позволяет мне полагать, что этот метод работает несколько асинхронно ... Но опять же, некоторые файлызагружаются (размер> 0 КБ), и есть эти пустые файлы (размер = 0 КБ), что наводит меня на мысль, что это все еще сериализованная загрузка ... Кроме того, функция retrieveFile () возвращает, цитируюдокументация:
Истина, если успешно завершено, ложь, если нет
Что мне нужно, это сериализованная загрузка, поскольку мне нужно регистрировать каждую неудачную загрузку.
При просмотре источника commons-net я увидел, что, если я не ошибаюсь, для каждого retrieveFile () * 101 создается новый сокет8 * call.
Я довольно смущен этим, поэтому, если кто-то может объяснить, что на самом деле происходит, и предложить решение с этой библиотекой, или порекомендовать какую-нибудь другую библиотеку Java FTP, которая поддерживает блокировку загрузки для файла, тобыло бы неплохо.
Спасибо.