java - commons-net FTPClient.retrieveFileStream() 返回错误结果

标签 java ftp apache-commons apache-commons-net

我在使用 commons-net FTPClient 时遇到问题。如果我从我的 ftp 服务器上使用retrieveFileStream() 下载文件,它可以工作,但我得到的结果是“150 Opening BINARY mode data connection for ...”。如果我调用 noop() 我会得到“226 传输完成”结果。对于接下来的每个操作,我都会得到前一个操作的结果。

我发现,FTPClient 会读取结果直到行尾,如果有两个结果行(如在retrieveFileStream() 之后),我会在下一个命令之后得到第二个结果行。我通过重写 FTPClient.retrieveFileStream() 做了一个解决方法,如下所示:

public static void main(String[] args){
    try {
        MyFTPClient ftpClient = new MyFTPClient();
        try {
            ftpClient.connect(ftphost, 21);
            if(!ftpClient.login( ftpuser, ftppassword )){
                throw new RuntimeException(ftpClient.getReplyString());
            }
            if(!ftpClient.changeWorkingDirectory("in")){
                throw new RuntimeException(ftpClient.getReplyString());
            }
            FTPFile[] files = ftpClient.listFiles();
            for(FTPFile file: files){
                if(file.getName().startsWith(FILENAME) && (file.getType() == FTPFile.FILE_TYPE)){
                    InputStream in = ftpClient.retrieveFileStream(file.getName());
                    CsvFile csvFile = new CsvFile(in, "ISO-8859-1", ';', "yyyyMMdd", "#.00", Locale.US, false);
                    in.close();
                    in = null;
                    System.out.println(ftpClient.getReplyString());
                    System.out.println(ftpClient.readLine());
                    System.out.println(ftpClient.rnfr(file.getName()));
                    System.out.println(ftpClient.getReplyString());
                    System.out.println(ftpClient.rnto("x" + file.getName()));
                    System.out.println(ftpClient.getReplyString());

                }
            }
            if(!ftpClient.logout()){
                throw new RuntimeException(ftpClient.getReplyString());
            }
        } finally {
            ftpClient.disconnect();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}

private static class MyFTPClient extends FTPClient{
    public String readLine(){
        try {
            __getReplyNoReport();
        } catch (IOException e) {
        }
        return getReplyString();
    }
}

调用 readLine() 方法可以获取额外的结果行。

但是这是 FTPClient 的错误还是我的 ftp 服务器的问题?该解决方法的问题是,如果只有一行响应,该方法会阻塞。

感谢您的帮助

斯蒂芬

最佳答案

有时阅读手册会有所帮助。调用completePendingCommand() 可以工作

关于java - commons-net FTPClient.retrieveFileStream() 返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20283182/

相关文章:

java - 使用java使用upsert在mongodb中获取com.mongodb.MongoException$DuplicateKey

java - iText 和 HTML 标签

java - Spring JPA - 如何使用复合键(EmbeddedID)保存对象

deployment - 有什么好的grunt ftp插件吗?

Java - 实现产生正态分布数字的随机 vector 生成器

java - 尝试弹出警报框以响应 AsyncTask

php - 如何使用php上传文件到父目录

javascript - 从 ftp 文件夹连续音频广播

java - Apache 公共(public)池 1 -> 2 : Recalling Hung or Inactive Connection Objects to the Pool

java - 执行exe并读取OutputStream