2013-10-13 3 views
-1

FTP에서 두 파일을 순차적으로 다운로드하려고합니다. 아무 문제없이 첫 번째 파일 다운로드. 그러나 InputStreamftpClient.retrieveFileStream()으로 초기화되면 NullPointerException이 throw됩니다. 시퀀스를 변경하려고했지만 효과가 없습니다. 파일이 존재하고 FTP에서 사용할 수 있습니다.FTP에서 파일을 다운로드하려고하면 NullPointerException이 발생합니다.

CODE

FTPClient ftpClient; 

    @Override 
    protected void onPreExecute() { 
     String server = "xxxxxxxxxxxxxxxxxxxxx"; 
     int port = 21; 
     String user = "xxxxxx"; 
     String pass = "xxxxxx"; 
     long fileSize = 0; 

     try { 
      ftpClient = new FTPClient(); 
      ftpClient.connect(server, port); 
      ftpClient.login(user, pass); 
      ftpClient.enterLocalPassiveMode(); 
      fileSize += getFileSize(ftpClient, CARDS_DB); 
      fileSize += getFileSize(ftpClient, IMG_DB); 
      showDialog(PROGRESS_DLG_ID); 
      downloadProgress.setMax((int) fileSize); 
     } catch (Exception e) { 
      Log.e("ERROR", e.toString()); 
     } 
    } 

    @Override 
    protected Boolean doInBackground(String... strings) { 

     final String PATH = getExternalCacheDir().toString() + "/"; 
     int total = 0; 

     try { 
      downloadFile(ftpClient, PATH, CARDS_DB, total); 
      downloadFile(ftpClient, PATH, IMG_DB, total); 
     } catch (Exception e) { 
      Log.e("EXCEPTION", e.toString()); 
      return false; 
     } finally { 
      try { 
       if (ftpClient.isConnected()) { 
        ftpClient.logout(); 
        ftpClient.disconnect(); 
       } 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

     return true; 
    } 

    private void downloadFile(FTPClient ftpClient, String PATH, String fileName, int total) { 
     try { 
      File downloadFile = new File(PATH + fileName); 
      OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(downloadFile)); 
      InputStream inputStream; 
      inputStream = ftpClient.retrieveFileStream(fileName); //here i have exception at second method invocation. 

      byte[] bytesArray = new byte[8192]; 
      int bytesRead; 
      while ((bytesRead = inputStream.read(bytesArray)) != -1) { 
       total += bytesRead; 
       outputStream.write(bytesArray, 0, bytesRead); 
       publishProgress(total); 
      } 
      outputStream.close(); 
      inputStream.close(); 

     } catch (Exception ex) { 
      Log.d("ERROR", "Error: " + ex.getMessage()); 
      ex.printStackTrace(); 
     } 
    } 

로그 캣 :

10-13 14:51:29.519 W/System.err(9554): java.lang.NullPointerException 
10-13 14:51:29.529 W/System.err(9554): at com.FHS.ActivityMain$DBLoad.downloadFile(ActivityMain.java:170) 
10-13 14:51:29.529 W/System.err(9554): at com.FHS.ActivityMain$DBLoad.doInBackground(ActivityMain.java:141) 
10-13 14:51:29.529 W/System.err(9554): at com.FHS.ActivityMain$DBLoad.doInBackground(ActivityMain.java:102) 
10-13 14:51:29.529 W/System.err(9554): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
10-13 14:51:29.529 W/System.err(9554): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
10-13 14:51:29.529 W/System.err(9554): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
10-13 14:51:29.529 W/System.err(9554): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
10-13 14:51:29.529 W/System.err(9554): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
10-13 14:51:29.529 W/System.err(9554): at java.lang.Thread.run(Thread.java:1019) 

해결 문제 해결. 메소드 downloadFile()을 호출 할 때마다 메소드 내에서 FTPClient를 초기화하고 열기/닫기 연결이 필요합니다.

+0

어떤 줄이'ActivityMain.java : 170'입니까? – ssantos

+0

@ssantos - 그는 이것을 소스에서 언급했습니다 - 코멘트를 찾으십시오 – kamituel

+0

맞아요, 제 잘못 ... – ssantos

답변

0

나는 문제가 코드 줄 생각 : 캐시가 비어 있지 않은 경우 방법 getExternalCacheDir()만 만하면 캐시 디렉토리를 반환합니다

final String PATH = getExternalCacheDir().toString() + "/"; 

때문이다. 캐시가 없으면 디렉토리가 없습니다.

대신 getExternalFilesDir()을 사용할 수 있습니다.

참조 :

편집 :는 친절에 ftpClient를 초기화 곳으로 코드 수정 :

int reply; 
ftp.connect(server,port); 
reply = ftp.getReplyCode(); 

을하고 응답을 확인 암호.

+0

getExternalFilesDir()을 사용해도 아무런 효과가 없습니다. 동일한 장소에서 같은 예외. –

+0

FTP가 두 개 이상의 파일을 hsd하고 있습니까? – user2339071

+0

FTP에는 많은 파일이 있지만 직접 2 개의 파일을로드하려고합니다. 더 이상은 없어. 그것들은 서버에 존재합니다. 하지만 첫 번째로드 - 초 후에 예외가 throw됩니다. –

0

귀하의 솔루션은 귀하의 스트림을 닫기 전에 downloadFile()에서 ftpClient.completePendingCommand()를 호출하지 않는다는 귀하의 문제를 마스킹한다고 생각합니다.

관련 문제