2013-10-13 110 views
-1

我试图从FTP顺序下载两个文件。首先下载文件没有任何问题。但是当InputStreamftpClient.retrieveFileStream()初始化时,第二次抛出NullPointerException。我试图改变序列,但它没有效果。文件存在并在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(); 
     } 
    } 

logcat的:

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

我认为这个问题是这行代码:

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

,因为该方法getExternalCacheDir(),并仅返回你的缓存目录,如果缓存不是空。如果没有缓存,则不会有目录。

您可以改为使用getExternalFilesDir()

参考:

编辑:请修改代码到初始化ftpClient到:

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

,并检查所述回复码。

+0

使用getExternalFilesDir()没有效果。在同一地方同样例外。 –

+0

你确定FTP hsd不止两个文件..? – user2339071

+0

FTP有很多文件,但我想直接加载2个文件。不再。它们存在于服务器上。但第一次加载后 - 秒抛出异常。 –

0

我认为你的解决方案是掩盖你的问题,这是你没有在关闭你的流之前在downloadFile()中调用ftpClient.completePendingCommand()。

相关问题