FTP-клиент Commons-Net неправильно загружает файлы - PullRequest
1 голос
/ 14 июля 2011

Решено

Оказалось, я неправильно понял, что на самом деле делает метод available (), поэтому я просто изменил код, который записал данные в это:

int b = input.read();
while (b != -1) {
    output.write(b);
    b = input.read();
}

Я поработаюо более эффективном методе чтения / записи в другой раз, сейчас я просто рад, что он работает.Спасибо за помощь!

Исходное сообщение

Я использую библиотеку Commons-Net для взаимодействия с сервером через FTP, и я столкнулся с проблемой при попытке загрузить файлы изсервер на локальной машине.Я не знаю, является ли это ошибкой в ​​Comments-Net.FTPClient, но, скорее всего, я просто не правильно использую библиотеку.Тем не менее, мне не удалось найти решение, когда я погуглил проблему, и пример кода, который я видел, похоже, использует тот же метод для загрузки файлов, что и я.

В любом случае, настоящая проблема заключается в том, чтонекоторые из загруженных файлов полностью пусты, когда они должны содержать данные.Это происходит случайным образом, поэтому каждый раз, когда я загружаю все файлы, разные файлы оказываются пустыми каждый раз.Я предполагаю, что есть проблема с тем, как я читаю данные с сервера или записываю их в файл.

Вот код:

// For each file
InputStream input = ftp.retrieveFileStream(sourcePath);
ftp.completePendingCommand();

OutputStream output = new FileOutputStream(new File(destinationPath));
while (input.available() > 0) {
    output.write(input.read());
}

input.close();
output.close();

Я довольноплохо знакомы с сетью, так что я просто глуп и делаю что-то очень простое неправильно?

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Вы не должны использовать input.available (), поскольку это просто говорит вам, сколько входных данных доступно без блокировки. Вместо этого зацикливайтесь до конца файла (т.е. пока read () не вернет -1).

http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html#read()

Если проблема заключается в эффективности, вы также можете попробовать читать более одного байта за раз.

0 голосов
/ 14 июля 2011

Проверьте commons-io с IOUtils и FileUtils для упрощения обработки потока

...