Как загрузить текстовый файл через FTP и прочитать содержимое в строку

Это переформулировано из предыдущего вопроса (который, вероятно, был немного неясен).

Я хочу загрузить текстовый файл через FTP с удаленного сервера, прочитать содержимое текстового файла в строку, а затем удалить файл. Мне не нужно на самом деле сохранять файл.

Я использую библиотеку Apache Commons, поэтому у меня есть:

import org.apache.commons.net.ftp.FTPClient;

Может ли кто-нибудь помочь, пожалуйста, не просто перенаправляя меня на страницу с множеством возможных ответов?


person Kevmeister    schedule 25.07.2012    source источник
comment
Да ладно, чувак. Это прямо в javadocs: commons. apache.org/net/api-3.1/org/apache/commons/net/ftp/   -  person duffymo    schedule 25.07.2012


Ответы (3)


Обычно я оставляю комментарий с вопросом "Что вы пробовали?". Но теперь я чувствую себя более щедрым :-)

Ну вот:

private void ftpDownload() {
    FTPClient ftp = null;
    try {
        ftp = new FTPClient();
        ftp.connect(mServer);

        try {
            int reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                throw new Exception("Connect failed: " + ftp.getReplyString());
            }
            if (!ftp.login(mUser, mPassword)) {
                throw new Exception("Login failed: " + ftp.getReplyString());
            }
            try {
                ftp.enterLocalPassiveMode();
                if (!ftp.setFileType(FTP.BINARY_FILE_TYPE)) {
                    Log.e(TAG, "Setting binary file type failed.");
                }
                transferFile(ftp);
            } catch(Exception e) {
                handleThrowable(e);
            } finally {
                if (!ftp.logout()) {
                    Log.e(TAG, "Logout failed.");
                }
            }
        } catch(Exception e) {
            handleThrowable(e);
        } finally {
            ftp.disconnect();
        }
    } catch(Exception e) {
        handleThrowable(e);
    }
}

private void transferFile(FTPClient ftp) throws Exception {
    long fileSize = getFileSize(ftp, mFilePath);
    InputStream is = retrieveFileStream(ftp, mFilePath);
    downloadFile(is, buffer, fileSize);
    is.close();

    if (!ftp.completePendingCommand()) {
        throw new Exception("Pending command failed: " + ftp.getReplyString());
    }
}

private InputStream retrieveFileStream(FTPClient ftp, String filePath)
throws Exception {
    InputStream is = ftp.retrieveFileStream(filePath);
    int reply = ftp.getReplyCode();
    if (is == null
            || (!FTPReply.isPositivePreliminary(reply)
                    && !FTPReply.isPositiveCompletion(reply))) {
        throw new Exception(ftp.getReplyString());
    }
    return is;
}

private byte[] downloadFile(InputStream is, long fileSize)
throws Exception {
    byte[] buffer = new byte[fileSize];
    if (is.read(buffer, 0, buffer.length)) == -1) {
        return null;
    }
    return buffer; // <-- Here is your file's contents !!!
}

private long getFileSize(FTPClient ftp, String filePath) throws Exception {
    long fileSize = 0;
    FTPFile[] files = ftp.listFiles(filePath);
    if (files.length == 1 && files[0].isFile()) {
        fileSize = files[0].getSize();
    }
    Log.i(TAG, "File size = " + fileSize);
    return fileSize;
}
person Dheeraj Vepakomma    schedule 25.07.2012
comment
duffymo - Мой ответ на ваш совет вы найдете где-нибудь в Интернете. Да ладно, чувак, просто погугли! - person Kevmeister; 25.07.2012
comment
Dheera — чрезвычайно многословный фрагмент кода, который привел к такому количеству ошибок, что Eclipse рухнул у меня. - person Kevmeister; 25.07.2012
comment
Может ли кто-нибудь дать мне более полезное решение, пожалуйста? - person Kevmeister; 25.07.2012
comment
@Kevmeister Вы серьезно ожидаете, что люди предоставят вам рабочее решение для вашего проекта на блюдечке? Тогда StackOverflow не место для этого. Этот код был взят из моего проекта после удаления ненужных частей кода. Так что, конечно, он не будет компилироваться. Постарайтесь понять это и адаптировать код под свои нужды. - person Dheeraj Vepakomma; 25.07.2012
comment
Нет, я не ожидаю этого, но я также не ожидаю, что мне бросят большой кусок некомментированного кода. Мне нужна помощь, а не нубская критика от большого плохого модератора форума. - person Kevmeister; 25.07.2012

Вы можете просто пропустить загрузку в часть локальной файловой системы и сделать:

    FTPClient ftpClient = new FTPClient();
    try {
       ftpClient.connect(server, port);
       ftpClient.login(user, pass);
       ftpClient.enterLocalPassiveMode();
       ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

       InputStream inputStream = ftpClient.retrieveFileStream("/folder/file.dat");
       BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "Cp1252"));

       while(reader.ready()) {
           System.out.println(reader.readLine()); // Or whatever
       }
       inputStream.close();

    } catch (IOException ex) {
         ex.printStackTrace();
    } finally {
         try {
             if (ftpClient.isConnected()) {
                 ftpClient.logout();
                 ftpClient.disconnect();
             }
         } catch (IOException ex) {
               ex.printStackTrace();
         }
    }
person Johan Amanou    schedule 15.11.2019

person    schedule
comment
Спасибо, Майк. Сегодня я выдохся, так что завтра (или послезавтра) я решу оставшуюся часть головоломки. - person Kevmeister; 25.07.2012
comment
@Kevmeister, ты забыл отметить это как ответ на свой вопрос. - person Federico Ponzi; 25.04.2018