2013-04-18 59 views
-1

我编写了这个类(从示例)下载包含在远程FTP文件夹中的所有文件的标题。它工作的很好,但是当它接近下载文件#146时,它会停止并出现NullPointException。文件#146存在,我可以将其作为单个文件实际下载。FTP下载停止在文件#146

在该方法中,remotePathLong包含写在一行中的所有远程文件夹并以空格字符隔开。

public void downloadHeader(String remotePathLong, String destPath, int bytes) { 

    String remotePath; 
    FTPFile[] fileList; 
    String[] fileNameList; 

    FTPClient ftpClient = new FTPClient(); 
    try { 
     ftpClient.connect(server); 
     ftpClient.login(user, pass); 
     ftpClient.enterLocalPassiveMode(); 
     ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 

     int indice = 0; 
     int iP = 1; 
     File downloadFile; 
     String destFile; 
     String remoteFile; 
     byte[] bytesArray; 
     int bytesRead = -1; 
     while ((remotePath = getPath(remotePathLong, iP)) != null) { 
      System.out.println("Loading file list from the server....."); 
      fileNameList = ftpClient.listNames(remotePath); 
      for (String file : fileNameList) { 
       indice += 1; 
       System.out.println(indice + " - Downloading: " + file); 

       //Select files 
       destFile = destPath.concat(file); 

       downloadFile = new File(destFile); 
       outputStream = new BufferedOutputStream(new FileOutputStream(downloadFile)); 

       //Download remote file (from ftp) 
       remoteFile = remotePath.concat(file); 

       inputStream = ftpClient.retrieveFileStream(remoteFile); 
       bytesArray = new byte[bytes]; 
       bytesRead = inputStream.read(bytesArray); 
       outputStream.write(bytesArray); 

       //Save into file 

       outputStream.close(); 
       inputStream.close(); 
       iP += 1; 
      } 
     } 

    } catch (IOException ex) { 
    } final{ 
     try { 
      if (ftpClient.isConnected()) { 
       ftpClient.logout(); 
       ftpClient.disconnect(); 
      } 
     } 
     catch (IOException ex1) { 
      System.out.println("Error: " + ex1.getMessage()); 
     } 
} 

当它到达bytesRead = inputStream.read(bytesArray)时,在迭代#146它给出错误。但如果在同一次迭代中,我重新初始化它的连接。 请问有人有建议吗?

+0

在迭代#146重新初始化连接? (这里只是半开玩笑) –

+0

请链接到示例? – hd1

+0

如果问题一致,则检查文件权限 –

回答

0

由于网络流量或文件大小恰好为146,您的连接可能会超时。 可以打印第146个文件名并检查其大小。你也可以增加FTP连接的超时时间

ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes 
+0

该文件为hnps2730.00d.Z,文件大小为308kB。与以前的尺寸没有什么不同。无论如何,我认为连接出现问题。事实上,如果我强迫下载#146下载其中一个以前的文件,它不会这样做。我试图把超时也增加到非常大的值,但没有任何改变。 – user2279697

+0

我会尝试在每个文件文件传输后得到答复(类似于client.getReplyString())并且还可以netstat -an | grep <您的ftp端口>来查看错误发生时coinnection是否还活着? –

+0

因此,我在每个inputStream.read(bytesArray)后面放置了getReplyString(),它总是说: 150-接受的数据连接 150 xx.x kbytes下载 但是对于文件#146它说: 226-文件成功传输 2260.000秒(这里测得),每秒 315.55兆字节但会产生一个NullPointerException Netsat打印: TCP地址:端口碧西:FTP ESTABLISHED – user2279697