Проблема при получении файла с сервера FTPS - PullRequest
0 голосов
/ 03 сентября 2010

Я работаю в разработке приложений. В этом приложении я выполняю операции по хранению, извлечению и удалению файлов. Для идентификации файлов на сервере я использую файл индекса (файл карты хеша). каждый раз, когда я выполняю операцию загрузки, я обновляю файл «index» и загружаю файл «index» на сервер вместе с другими загружаемыми файлами.

Для выполнения операции удаления сначала я извлекаю файл «index» и на основе индекса удаляю файлы с сервера, а после обновления файла «index» я снова загружаю файл «index» на сервер.

Я могу успешно выполнить операцию загрузки файла, но при выполнении операции удаления я получаю исключение "java.io.EOFException", когда пытаюсь получить файл "index".

Я пишу следующий код для загрузки файла «index» с сервера FTPS

//download index file
if (service.retrFile("INDEX", "") == service.OK) {
    try {
        ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("INDEX"));
        try {
       Map<String, FileData> filesUploaded = (HashMap<String, FileData>) objIn.readObject();

        } catch (ClassNotFoundException ex) {
           ex.printStackTrace();
        }
        objIn.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

Где «service.ok» возвращает «0», если он успешно подключен к серверу FTPS и «FileData» содержит информацию о файле (атрибуты).

Тот же код, который я использую при выполнении операции загрузки. там все работает нормально без исключения. но при выполнении операции удаления, когда я получаю «индексный» файл, я получаю исключение для оператора:

Файлы файловUploaded = (HashMap) objIn.readObject ();

Исключение составляет:

SEVERE: ноль

java.io.EOFException
        at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2298)
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2767)
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:798)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
        at com.pixelvault.gui.DeleteServerFilesDialog.startDeleting(DeleteServerFilesDialog.java:447)

Я проверил, правильно ли закрыты соединения с сервером FTPS после выполнения соответствующих операций.

Я не понимаю, где я делаю неправильно.

Пожалуйста, дайте мне ваши ценные предложения. Я благодарен всем вашим предложениям, которые помогут мне преодолеть эту проблему.


Я использую org.apache.commons.net.ftp, а «retrFile» - это метод, созданный мной для получения файлов с сервера.

Вот код для "retrFile"

FTPSClient ftp;

public int retrFile (String filename, String savePath) { если (! подключен) { возврат ERR; }

    FileOutputStream fout = null;
    InputStream bin = null;
    try {
        ftp.enterLocalPassiveMode();
        fout = new FileOutputStream(savePath + filename);
        bin = ftp.retrieveFileStream(filename);
        if (bin == null) {
            fout.close();
            return ERR;
        }
        byte[] b = new byte[ftp.getBufferSize()];
        int bytesRead = 0;
        while ((bytesRead = bin.read(b, 0, b.length)) != -1) {
            fout.write(b, 0, bytesRead);
        }
        ftp.completePendingCommand();
        fout.close();           
    } catch (FTPConnectionClosedException ex) {
         ex.printStackTrace();
        connected = false;
        return NOT_CONNECTED;
    } catch (IOException ex) {
         ex.printStackTrace();
        return ERR;
    } finally {
        try {
            fout.close();
        } catch (IOException ex) {
             ex.printStackTrace();
            return ERR;
        }
        try {
            if (bin != null) {
                bin.close();
            }
        } catch (IOException ex) {
             ex.printStackTrace();

            return ERR;
        }
    }
    return OK;
}

1 Ответ

1 голос
/ 03 сентября 2010

Вы уверены, что файл INDEX правильно загружен?

Он присутствует в файловой системе, когда приложение закрыто?

Какую FTP-библиотеку вы используете? я знаю только commons.net из Apache и не распознаю метод файла «retrFile». Может ли он быть многопоточным, чтобы файл не был полностью загружен при выполнении оператора readObject?

...