4

私の要件は、さまざまなディレクトリから必要なファイル拡張子のファイルのリストを取得することです。ファイル自体を取得しながら、入力ストリームを取得して何らかの処理を行う必要があります....必要なファイル拡張子を持つファイルのリストを取得しようとしています。そのリストで選択したすべてのファイルから入力ストリームを取得しようとしています。最初の反復では、必要なファイルを取得しています。また、1 つのファイルのストリームを取得していますが、次のファイルではヌル ポインター例外が発生します。また、2回目の繰り返しからファイルのリストを取得できません

テストに使用したサンプルコード:

        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」の最初のファイルは正しく読み取られますが、2 番目のファイルを読み取ろうとすると、null ポインター例外が表示されます .... また、retrieveFileStream メソッドを使用してストリームを読み取った後、現在の作業ディレクトリを印刷しようとすると、null 値が返されますが、まだ接続されていると表示されます....

コードにバグがある場合はお知らせください....私にとって唯一の回避策は、入力ストリームを読み取るたびにftpの場所に接続することでしたが、これは良いことではありません....

4

2 に答える 2

7
  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() を呼び出し、その戻り値をチェックして成功を確認する必要があります。

トランザクションを完了するために FTP コマンドのシーケンス全体を完了しない FTPClient メソッドがいくつかあります。これらのコマンドは、肯定的な中間コマンドの受信後に、プログラマーによる何らかのアクションを必要とします。プログラマーのコードがアクションを完了した後、このメソッドを呼び出してサーバーから完了応答を受信し、トランザクション全体が成功したことを確認する必要があります。これは、コモンズ API が言うことです

于 2015-03-20T05:06:21.960 に答える
0

私が提案する2つの最適化があります。まず、FTPClient.listNamesを使用することをお勧めします。これにより、文字列の配列が返されます。次に、ファイル内のコンテンツの文字列表現を返すIOUtils.readFully(inputStream)を使用します。

問題が発生したので、これらのコマンドをloclパッシブモードで実行していると思います。これをftp.retreiveFileStreamの上のコードに含めます。

ftp.enterLocalPassiveMode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setRemoteVerificationEnabled(false);
于 2012-11-12T23:12:14.097 に答える