2012-03-23 12 views
4

私の要件は、異なるディレクトリから必要なファイル拡張子のファイルのリストを取得し、ファイルを取得する際に入力ストリームを取得して処理を行う必要があります.... 必要なファイル拡張子を持つファイルのリストを取得しようとしている場合、そのリスト内のすべての選択されたファイルから入力ストリームを取得しようとしています。 は、最初の繰り返しのために、私は必要なファイルを取得していますし、また、私は1つのファイルのためのストリームを取得していますが、次のファイルのために、私は、nullポインタ例外を取得します。 「mydirectoryなど」にCommons FTPClient InputStreamを1つの接続で複数のファイルから取得する

 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として示されており、最初のファイル:私はまた、2回目の反復から、私がテストに使用

サンプル・コードをファイルのリストを取得することができません正しく読まれるが、それは私が現在の作業ディレクトリを印刷しようとした場合、retrieveFileStreamメソッドを使用してストリームを読んだ後、それは....も、それがnullポインタ例外null値を与えるが、それはまだあると言う言う第二のファイルを読み込もうとするとき接続....

.... 唯一の回避策のために私は私のコードにいくつかのバグを持っているなら、私に知らせてください。私は、私がお勧めし2つの最適化があります

答えて

0

....行うには良いことではありませんすべての入力ストリームの読み取りのためのFTPの場所に接続するようにしました。 まず、FTPClient.listNamesの使用をお勧めします。これは文字列の配列を返します。 2番目に、IOUtils.readFully(inputStream)を使用して、ファイル内の内容のString表現を返します。

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

ftp.enterLocalPassiveMode(); 
ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 
ftp.setRemoteVerificationEnabled(false); 
4
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() 
        + "]---------------------"); 
     } 

しばらく(ftpClient.completePendingCommand()!)。 ファイル転送を終了するには、completePendingCommand()を呼び出して戻り値を確認し、成功を確認する必要があります。

トランザクションを完了するためにFTPコマンドのシーケンス全体を完了しないFTPClientメソッドがいくつかあります。これらのコマンドは、正の中間コマンドを受信した後、プログラマによって何らかのアクションを必要とする。プログラマーのコードがアクションを完了した後、このメソッドを呼び出して、サーバーから完了応答を受け取り、トランザクション全体の成功を確認する必要があります。これは、コモンズのAPIが言うhttp://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#retrieveFileStream(java.lang.String)

です