【问题标题】:ftpClient.retrieveFileStream(filepath) returning nullftpClient.retrieveFileStream(filepath) 返回 null
【发布时间】:2016-05-18 10:06:14
【问题描述】:

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

我的代码是

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);
                }

             }

        }
    }
  }
 }

为什么我从第二个文件中获取 InputStream 为空??

【问题讨论】:

  • 您可以访问服务器端日志吗?您可以将其附加到您的问题中吗?如果没有,请使用 Wireshark 捕获 FTP 控制连接。
  • 我相信您需要先关闭上一个文件中的InputStream
  • 关闭 InputStream 后的行为相同

标签: java ftp


【解决方案1】:

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

documentation中所述

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

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

编辑:刚刚注意到这是一篇很老的帖子。但希望对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多