блокирование (синхронно) загрузки ftp в java? - PullRequest
0 голосов
/ 30 августа 2011

В настоящее время я использую библиотеку 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, которая поддерживает блокировку загрузки для файла, тобыло бы неплохо.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Вы можете просто использовать класс java.net.URLConnection, который существует всегда.Он должен знать, как правильно обрабатывать URL-адреса FTP. Здесь - это простой пример, который должен дать требуемое поведение блокировки.

Предупреждение: вы должны сами управлять потоками ввода / вывода, но это должно быть довольно просто..

0 голосов
/ 11 ноября 2011

Хорошо, чтобы кратко ответить на этот вопрос, чтобы не запутать людей, которые могут увидеть этот вопрос.
Да, commons-net для FTP работает так, как я и думал, то есть метод retrieveFile () блокирует до завершения загрузки.
Это была (конечно) моя собственная «ошибка» в коде, которая позволяла мне думать иначе.

...