• 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();进行读取数据时,由于时网络传输,可能会导致数据的丢失,读取的数据长度也会有限制,后续做改正.........

  • 相关阅读:
    <NET CLR via c# 第4版>笔记 第18章 定制特性
    <NET CLR via c# 第4版>笔记 第17章 委托
    <NET CLR via c# 第4版>笔记 第16章 数组
    <NET CLR via c# 第4版>笔记 第15章 枚举类型和位标志
    <NET CLR via c# 第4版> 读书笔记--目录
    <NET CLR via c# 第4版>笔记 第14章 字符,字符串和文本处理
    <NET CLR via c# 第4版>笔记 第13章 接口
    <NET CLR via c# 第4版>笔记 第12章 泛型
    python 之实例属性和类属性
    python 之获取对象信息
  • 原文地址:https://www.cnblogs.com/karlz/p/14075233.html
Copyright © 2020-2023  润新知