2012-03-23 3 views
4

내 요구 사항은 다른 디렉토리에서 필요한 파일 확장명의 파일 목록을 가져 오는 동안 파일 자체를 가져 오는 동안 입력 스트림을 가져와 일부 처리를 수행해야합니다. I 필요한 파일 확장명을 가진 파일 목록을 얻으려고하는 중, 그 목록에있는 모든 선택된 파일에서 입력 스트림을 얻으려고합니다. 첫 번째 반복에서는 필요한 파일을 가져 오는 중 하나의 파일에 대한 스트림을 받고 있지만 다음 파일의 경우 널 포인터 예외가 발생합니다. 'mydirectory'에Commons FTPClient InputStream 하나의 연결에 여러 파일에서

 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으로 표시되며, 첫 번째 파일 : 나는 또한 두 번째 반복에서 내가 테스트하는 데 사용

샘플 코드 파일의 목록을 얻을 수 없습니다입니다 올바르게 읽었지만 두 번째 파일을 읽으려고하면 null 포인터 예외가 발생합니다 .... 또한 현재 작업 디렉토리를 인쇄하려고하면 retrieveFileStream 메서드를 사용하여 스트림을 읽은 후 null 값을 제공하지만 여전히 그렇다고합니다. 연결된 ....

내 코드에 버그가있는 경우 알려주십시오 .... 유일한 해결 방법은 다음과 같습니다. 모든 입력 스트림에 대해 ftp 위치에 연결하는 것은 좋은 일이 아니 었습니다. ...

답변

0

내가 제안 할 두 가지 최적화가 있습니다. 먼저 FTPClient.listNames를 사용하는 것이 좋습니다. 문자열 배열을 반환합니다. 두 번째로 파일의 내용에 대한 문자열 표현을 반환하는 IOUtils.readFully (inputStream)를 사용하십시오.

지금 당장 문제가 생기면 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)

관련 문제