ftpClient.retrieveFileStream(filepath)返回null

smi*_*ith 7 java ftp

我有一个文件夹,它在ftp中有3个文件.对于第一个文件,bufferreader正在成功读取.但是从第二个文件InputStream获取为null.不知道是什么原因.

我的代码是

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
 import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.SocketException;
import java.util.logging.Logger;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class ExtractFile{

 public static void main(String args[]) {

 // get an ftpClient object
 FTPClient ftpClient = new FTPClient();
 FileOutputStream fos = null;

  try {
  // pass directory path on server to connect
  ftpClient.connect("XXXX");

  // pass username and password, returned true if authentication is
 // successful
  boolean login = ftpClient.login("XXXX", "XXXXX");

 if (login) {
System.out.println("Connection established...");

FTPFile[] files=ftpClient.listDirectories();
for(int i=0;i<files.length;i++){


    FTPFile file=files[i];

    BufferedReader reader = null;
    String firstLine = null;

    try {

        String currentline=null;

        listDirectory(ftpClient, ftpClient.printWorkingDirectory(), "", 0);


    } finally {
        if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
    }



}


   boolean logout = ftpClient.logout();
   if (logout) {
    System.out.println("Connection close...");
    }
   } else {
   System.out.println("Connection fail...");
  }

  } catch (SocketException e) {
   e.printStackTrace();
  } catch (IOException e) {
  e.printStackTrace();
  } finally {
   try {
  ftpClient.disconnect();
  } catch (IOException e) {
  e.printStackTrace();
 }
}
}
 static void listDirectory(FTPClient ftpClient, String parentDir,
        String currentDir, int level) throws IOException {
    String dirToList = parentDir;
    if (!currentDir.equals("")) {
        dirToList += "/" + currentDir;
    }

    FTPFile[] subFiles = ftpClient.listFiles(dirToList);

    if (subFiles != null && subFiles.length > 0) {
        for (FTPFile aFile : subFiles) {
            String currentFileName = aFile.getName();

            if (currentFileName.equals(".")
                    || currentFileName.equals("..")) {

                continue;
            }
            for (int i = 0; i < level; i++) {
                System.out.print("\t");
            }
            if (aFile.isDirectory()) {
                System.out.println("[" + currentFileName + "]");
                listDirectory(ftpClient, dirToList, currentFileName, level + 1);
            } else {
                System.out.println(currentFileName);
                String currentline=null;
                BufferedReader reader = null;
                String firstLine = null;

                /*****here i am getting stream as null**********/
                InputStream stream = ftpClient.retrieveFileStream(dirToList+"/"+currentFileName);                   



                reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
                String[] lines=new String[5];
                int i=0;

                    //TODO 

                while((currentline=reader.readLine())!=null){
                    lines[i]=currentline;
                    i++;
                        System.out.println(".."+currentline);
                }

             }

        }
    }
  }
 }
Run Code Online (Sandbox Code Playgroud)

为什么我从第二个文件中将InputStream作为null?

ala*_*een 8

我遇到了同样的问题,并通过调用completePendingCommand()并确认传输确实成功解决了问题来完成文件传输.

文档中所述

要完成文件传输,您必须调用completePendingCommand并检查其返回值以验证是否成功.如果不这样做,后续命令可能会出现意外行为.

如果这不能解决问题,请使用getReplyCode()或getReplyString()或getReplyStrings()来查看确切的问题.

编辑:刚刚注意到这是一个非常古老的帖子.但希望它对其他人有帮助.