2016-05-18 2 views
4

私はフォルダがあり、ftpに3つのファイルがあります。最初のファイルでは、bufferreaderは正常に読み込み中です.2番目のファイルからInputStreamがnullになっています。ftpClient.retrieveFileStream(filepath)nullを返す

私は2番目のファイルからNULLとしてInputStreamを取得していますなぜ私のコードは

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.SocketException; 
import java.util.logging.Logger; 

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

public class ExtractFile{ 

public static void main(String args[]) { 

// get an ftpClient object 
FTPClient ftpClient = new FTPClient(); 
FileOutputStream fos = null; 

    try { 
    // pass directory path on server to connect 
    ftpClient.connect("XXXX"); 

    // pass username and password, returned true if authentication is 
// successful 
    boolean login = ftpClient.login("XXXX", "XXXXX"); 

if (login) { 
System.out.println("Connection established..."); 

FTPFile[] files=ftpClient.listDirectories(); 
for(int i=0;i<files.length;i++){ 


    FTPFile file=files[i]; 

    BufferedReader reader = null; 
    String firstLine = null; 

    try { 

     String currentline=null; 

     listDirectory(ftpClient, ftpClient.printWorkingDirectory(), "", 0); 


    } finally { 
     if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
    } 



} 


    boolean logout = ftpClient.logout(); 
    if (logout) { 
    System.out.println("Connection close..."); 
    } 
    } else { 
    System.out.println("Connection fail..."); 
    } 

    } catch (SocketException e) { 
    e.printStackTrace(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } finally { 
    try { 
    ftpClient.disconnect(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
} 
} 
} 
static void listDirectory(FTPClient ftpClient, String parentDir, 
     String currentDir, int level) throws IOException { 
    String dirToList = parentDir; 
    if (!currentDir.equals("")) { 
     dirToList += "/" + currentDir; 
    } 

    FTPFile[] subFiles = ftpClient.listFiles(dirToList); 

    if (subFiles != null && subFiles.length > 0) { 
     for (FTPFile aFile : subFiles) { 
      String currentFileName = aFile.getName(); 

      if (currentFileName.equals(".") 
        || currentFileName.equals("..")) { 

       continue; 
      } 
      for (int i = 0; i < level; i++) { 
       System.out.print("\t"); 
      } 
      if (aFile.isDirectory()) { 
       System.out.println("[" + currentFileName + "]"); 
       listDirectory(ftpClient, dirToList, currentFileName, level + 1); 
      } else { 
       System.out.println(currentFileName); 
       String currentline=null; 
       BufferedReader reader = null; 
       String firstLine = null; 

       /*****here i am getting stream as null**********/ 
       InputStream stream = ftpClient.retrieveFileStream(dirToList+"/"+currentFileName);     



       reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
       String[] lines=new String[5]; 
       int i=0; 

        //TODO 

       while((currentline=reader.readLine())!=null){ 
        lines[i]=currentline; 
        i++; 
         System.out.println(".."+currentline); 
       } 

      } 

     } 
    } 
    } 
} 

あります?

+0

サーバー側のログにアクセスできますか?あなたの質問にそれを追加できますか?そうでない場合は、Wiresharkを使用してFTPコントロール接続を取得します。 –

+0

私は前のファイルから 'InputStream'を閉じる必要があると思います。 – SubOptimal

+0

InputStreamを閉じた後の同じ動作 – smith

答えて

4

私は同じ問題に直面し、completePendingCommand()を呼び出して転送を確定し、転送が成功したことを確認して問題を修正しました。

としては、あなたが成功したかどうかを確認するためにcompletePendingCommandを呼び出し、その戻り値をチェックしなければならないファイル転送を確定するにはdocumentation

で述べました。これが行われないと、後続のコマンドが突然動作する可能性があります。

問題が解決しない場合は、getReplyCode()またはgetReplyString()またはgetReplyStrings()を使用して、正確な問題を確認します。

編集:ちょうどこれがかなり古い投稿であることに気づいた。しかし、それが他の人に役立つことを願っています。