Располагает FTPClient InputStream из нескольких файлов в одном соединении - PullRequest
4 голосов
/ 23 марта 2012

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

Пример кода, который я использовал для проверки:

        System.out.println(ftp.printWorkingDirectory());
        boolean status = ftp
                .changeWorkingDirectory("mydirectory");
        System.out.println("Status of Change Directory:" + status);
        System.out.println(ftp.printWorkingDirectory());
        InputStream is = null;

        System.out.println(ftp.printWorkingDirectory());
        System.out.println(ftp.isConnected());

        FTPFile[] list2 = ftp.listFiles();
        System.out.println("Number of files in this directory:"
                + list2.length);
        for (int i = 0; i < list2.length; i++) {
            System.out.println("-------[" + list2[i].getName()
                    + "]---------------------");
            is = ftp.retrieveFileStream(list2[i].getName());
            int bytesRead = 0;
            byte[] buffer = new byte[1024];
            while ((bytesRead = is.read(buffer, 0, buffer.length)) > 0) {
                System.out.println(new String(buffer, 0, bytesRead));
            }
            //is.close();

            System.out.println("-------[END:" + list2[i].getName()
                    + "]---------------------");
        }

Количество файлов отображается как 3, а первый файл вmydirectory читается правильно, но когда он пытается прочитать второй файл, он сообщает об исключении нулевого указателя .... также, после того, как я прочитал поток, используя метод retrieveFileStream, если я пытаюсь напечатать текущий рабочий каталог, он дает нулевое значение,говорит, что он все еще подключен ....

Пожалуйста, дайте мне знать, если у меня есть какие-то ошибки в моем коде .... Единственный обходной путь для меня был подключиться к местоположению ftp для каждого чтения входного потока, которыйне очень хорошая вещь ....

Ответы [ 2 ]

7 голосов
/ 20 марта 2015
  System.out.println(ftp.printWorkingDirectory());
        boolean status = ftp
                .changeWorkingDirectory("mydirectory");
        System.out.println("Status of Change Directory:" + status);
        System.out.println(ftp.printWorkingDirectory());
        InputStream is = null;

        System.out.println(ftp.printWorkingDirectory());
        System.out.println(ftp.isConnected());

        FTPFile[] list2 = ftp.listFiles();
        System.out.println("Number of files in this directory:"
                + list2.length);
        for (int i = 0; i < list2.length; i++) {
            System.out.println("-------[" + list2[i].getName()
                    + "]---------------------");
            is = ftp.retrieveFileStream(list2[i].getName());
            int bytesRead = 0;
            byte[] buffer = new byte[1024];
            while ((bytesRead = is.read(buffer, 0, buffer.length)) > 0) {
                System.out.println(new String(buffer, 0, bytesRead));
            }
            is.close();
            while(!ftpClient.completePendingCommand());
            System.out.println("-------[END:" + list2[i].getName()
                    + "]---------------------");
        }

while (! FtpClient.completePendingCommand ());Чтобы завершить передачу файла, вы должны вызвать completePendingCommand () и проверить его возвращаемое значение, чтобы проверить успешность.

Существует несколько методов FTPClient, которые не завершают всю последовательность команд FTP для завершения транзакции.Эти команды требуют определенных действий от программиста после получения положительной промежуточной команды.После того, как код программиста завершает свои действия, он должен вызвать этот метод, чтобы получить ответ о завершении от сервера и проверить успешность всей транзакции.Это то, что API общего пользования говорит, http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#retrieveFileStream(java.lang.String)

0 голосов
/ 13 ноября 2012

Я бы предложил две оптимизации.Во-первых, я бы рекомендовал использовать FTPClient.listNames.Это вернет массив строк.Во-вторых, используйте IOUtils.readFully (inputStream), который возвращает строковое представление содержимого в файле.

Теперь перейдем к рассматриваемой проблеме, я предполагаю, что вы выполняете эти команды в пассивном режиме locl.включите это в ваш код выше ftp.retreiveFileStream.

ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setRemoteVerificationEnabled(false);
...