2013-08-14 2 views
0

InputStreamReader выбрасывает NPE следующим образом, когда я выполняю этот код на второй итерации цикла for. Код отлично работает для первой итерации и возвращает следующую NPE на второй итерации. Я использую фрагмент кода для чтения содержимого определенного файла из местоположения FTP и его отображения. Обратите внимание на все строки до тех пор, пока новый InputStreamReader не будет работать даже на второй итерации. Любые идеи почему?InputStreamReader бросает NPE на вторую итерацию цикла for

Exception in thread "main" java.lang.NullPointerException 
at java.io.Reader.<init>(Reader.java:61) 
at java.io.InputStreamReader.<init>(InputStreamReader.java:55) 
at com.test.txtweb.server.task.CallBackRetryTask.main(CallBackRetryTask.java:229) 

Вот исходный код:

public static void main(String[] args){ 
    String strDate = "20130805"; 

    FTPClient ftpClient = new FTPClient(); 

    try { 
     ftpClient.connect(host); 
     String pathToFiles = "/path/to/File"; 
     String ftpFileName = ""; 
     List<String> ftpFileNames = null; 
     InputStream iStream; 
     if(ftpClient.login(username, password)){ 
      ftpClient.enterLocalPassiveMode(); 
      FTPFile[] ftpFiles = ftpClient.listFiles(); 
      ftpFileNames = new ArrayList<String>(); 
      for (FTPFile ftpFile : ftpFiles) { 
       ftpFileName = ftpFile.getName(); 
       if(ftpFileName.contains(strDate)){ 
        iStream = ftpClient.retrieveFileStream(pathToFiles + ftpFileName); 
        System.out.println(ftpClient.getReplyString()); 

        InputStreamReader isr = new InputStreamReader(iStream); //Error on this line on second iteration 
        BufferedReader br = new BufferedReader(isr); 

        String line = ""; 

        while ((line = br.readLine()) != null) { 
         System.out.println(line); 
        } 

       } 
      } 
     } 

ответ

0

Разобрался вопрос после того, как довольно много отладки. Я не вызывал completePendingCommand() после передачи файла, чтобы проверить статус передачи.

В API для FTPClient.retrieveFileStream() указано, что для завершения передачи файла вы должны позвонить FTPClient.completePendingCommand() и проверить его возвращаемое значение для подтверждения успеха. После исправления этой проблемы все стало нормально работать.