1:调用ftpClient.retrieveFileStream(String remoteFilePath)第二次读取为空

描述:当读取一个文件夹时,文件夹中又存在多个文件,循环读取时,第一次调用

           InputStream inputStream = ftpClient.retrieveFileStream(String remoteFilePath)可以读出数据,当再次调用时,inputStream = null;

解决方法:在执行完inputStream.close();方法之后,执行ftpClient.completePendingCommand();

代码:

public ResultData getFromFtpDataToDatabase(HttpServletRequest request){
        ResultData resultData = new ResultData(Result_Code.SUCCESS);

        String IP = Tools.processNull("***.***.***.***");
        //ftp端口是21 使用WinSCP 采用的是SSH连接端口号是22
        String PORT = Tools.processNull("21");
        String userName= Tools.processNull("userName");
        String passWord = Tools.processNull("passWord");
        String directory = Tools.processNull("");
        String upload = Tools.processNull("/upload/");
        String history = Tools.processNull("/history/");
        String filepath = "/test/";
        String paths = null;
        try {
            paths = new String(filepath.getBytes(),"UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //创建FTPClient对象
        FTPClient ftpClient = new FTPClient();

        try{
            //解决文件夹有中文是读不出文件问题
            ftpClient.setAutodetectUTF8(true);
            ftpClient.connect(IP, Integer.parseInt(PORT));
            ftpClient.enterLocalPassiveMode();
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.setFileTransferMode(FTP.BLOCK_TRANSFER_MODE);
            ftpClient.login(userName, passWord);
            //读取文件夹下文件
            FTPFile[] files = ftpClient.listFiles(paths);
            //获取文件名称
            String saveAsFileName = null;
            for (int i = 0; i < files.length; i++) {
                saveAsFileName=files[i].getName();
                //文件路径
                String remoteFile = filepath+saveAsFileName;
                // get output stream of the response
                InputStream inputStream = ftpClient.retrieveFileStream(remoteFile);

int available = inputStream.available(); //将文件值转为二进制数据 byte[] bytesArray = new byte[available]; inputStream.read(bytesArray); //插入到数据库中,代码未体现
inputStream.close(); //ftpClient.getReply();
//调用
ftpClient.completePendingCommand()解决第二次读取为空情况
ftpClient.completePendingCommand();
            }
        }catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                // 注销FTP客户端
                if(ftpClient!=null){
                    ftpClient.logout();
                }
            } catch (Exception e) {
                // 如果FTP注销失败什么也不做,忽略掉异常。
            }
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException ex2) {
                    ex2.printStackTrace();
                }
            }
        }
        resultData.put("msg","操作成功");
        return resultData;
    }

解决方案:

调用ftpClient.completePendingCommand();
注意:
FTP Server只有在接受到InputStream 执行close方法时,才会返回。所以一定先要执行close方法。不然在第一次下载一个文件成功之后,之后再次获取inputStream 就会返回null

存在问题:使用inputStream.available();进行读取数据时,由于时网络传输,可能会导致数据的丢失,读取的数据长度也会有限制,后续做改正.........

原文地址:https://www.cnblogs.com/karlz/p/14075233.html