首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Apache FTPClient.retrieveFileStream(字符串)返回null

Apache FTPClient.retrieveFileStream(字符串)返回null
EN

Stack Overflow用户
提问于 2022-02-18 11:42:00
回答 1查看 296关注 0票数 0

我正在使用Java 11和SpringBoot。我正在尝试创建一个FTPClient来从现有的FTP服务器读取文件。使用Apache FTPClient

问题:

代码语言:javascript
运行
复制
InputStream is = ftp.retrieveFileStream(file.getName());

下面总是返回一个null InputStream。

信息:

代码语言:javascript
运行
复制
logger.info("File name: "+file.getName()+", type: "+file.getType()+", size: "+file.getSize()+".");

返回:

文件名: cam_test,输入: 1,大小: 28。

问题:

您可以看到有一个名为“cam”的文件,为什么不能将其转换为InputStream?

代码:

代码语言:javascript
运行
复制
import org.apache.commons.net.ftp.FTPClient;

public void processFiles() {
    FTPClient ftp = new FTPClient();
    try {
        ftp.connect(IP_ADDRESS);

        int reply = ftp.getReplyCode();

        logger.info("Connected to " + IP_ADDRESS + ". ReplyCode: '"+reply+"'.");
        if(!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            logger.error("FTP server ('"+IP_ADDRESS+"') refused connection.");
        } else {
            // transfer files
            ftp.login(USERNAME, PASSWORD);
            FTPFile[] files = ftp.listFiles(BASE_DIR);
            logger.info("Connected to " + IP_ADDRESS + ". Got '"+files.length+"' files from working directory: "+ftp.printWorkingDirectory()+BASE_DIR+".");
            for (FTPFile file : files) {
                logger.info("File name: '"+file.getName()+"', type: '"+file.getType()+"', size: '"+file.getSize()+"', directory: '"+file.isDirectory()+"', file: '"+file.isFile()+"'.");
                if (file.isFile() && 0 == file.getType()) {
                    InputStream is = ftp.retrieveFileStream(file.getName());  // <--- is always null
                    processFile(file, is);
                    if (is != null) {
                        is.close();
                    }
                    boolean completePendingCommand = ftp.completePendingCommand();
                    logger.info("completePendingCommand: "+completePendingCommand);
                }
            }
        }
    } catch(IOException e) {
        logger.error(e.getMessage(), e);
    } finally {
        if(ftp.isConnected()) {
            try {
                ftp.disconnect();
            } catch(IOException ioe) {
                // do nothing
            }
        }
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2022-02-18 12:42:27

必须在每个命令之后添加completePendingCommand

在下面的代码中,completePendingCommand被注释掉了。

代码语言:javascript
运行
复制
        for (FTPFile file : files) {
          System.out.println(
              "File name: " + file.getName() + ", type: " + file.getType() + ", size: " + file.getSize() + ".");
          InputStream is = ftp.retrieveFileStream(file.getName());

          System.out.println(is == null);

//          ftp.completePendingCommand();
        }

结果是:

连接到ftp.dlptest.com。220 文件名: actorstoday.txt,类型: 0,大小: 0。错误 文件名: actorstomorrow.txt,类型: 0,大小: 0。真的

正如您所看到的,第二个请求是返回一个空InputStream。

改为:

代码语言:javascript
运行
复制
for (FTPFile file : files) {
  System.out.println(
      "File name: " + file.getName() + ", type: " + file.getType() + ", size: " + file.getSize() + ".");
  InputStream is = ftp.retrieveFileStream(file.getName());

  System.out.println(is == null);

  ftp.completePendingCommand();
}

结果是:

连接到ftp.dlptest.com。220 文件名: actorstoday.txt,类型: 0,大小: 0。错误 文件名: actorstomorrow.txt,类型: 0,大小: 0。错误

在for循环的每次迭代中,您必须调用completePendingCommand

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71172909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档