Java commons net FTPClient.retrieveFileStream()返回错误的结果

Java commons net FTPClient.retrieveFileStream()返回错误的结果,java,ftp,apache-commons,apache-commons-net,Java,Ftp,Apache Commons,Apache Commons Net,我对commons net FTPClient有问题。如果我从我的ftp服务器wirth retrieveFileStream()下载一个文件,它可以工作,但我得到的结果是“150为…打开二进制模式数据连接”。如果调用noop(),结果是“226传输完成”。对于下面的每个操作,我都会得到上一个操作的结果 我发现,FTPClient会一直读取结果,直到行尾,如果有两个结果行(在retrieveFileStream()之后),我会在下一个命令之后得到第二个结果行。我通过如下方式重写FTPClient

我对commons net FTPClient有问题。如果我从我的ftp服务器wirth retrieveFileStream()下载一个文件,它可以工作,但我得到的结果是“150为…打开二进制模式数据连接”。如果调用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()可以工作

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

以前的代码示例出错,我将其替换。阅读手册有时会有所帮助。调用completePendingCommand()可以工作。您应该将其作为答案发布并接受它。回答您自己的问题是完全可以的。以前的代码示例是错误的,我将其替换。阅读手册有时会有所帮助。调用completePendingCommand()可以工作。您应该将其作为答案发布并接受它。回答你自己的问题完全没问题。我认为你不应该因为错过这个而对自己太苛刻,这是完全不明显的,我在使用
时也错过了它。retrieveFileStream
我认为你不应该因为错过这个而对自己太苛刻,这是完全不明显的,使用
.retrieveFileStream