解决调用ftpClient.retrieveFileStream(String remoteFilePath)第二次读取为空问题

 更新时间:2023年08月08日 10:41:19   作者:DaXianZ  
这篇文章主要给大家介绍了关于如何解决调用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();
<strong>注意:</strong>FTP Server只有在接受到InputStream 执行close方法时,才会返回。所以一定先要执行close方法。不然在第一次下载一个文件成功之后,之后再次获取inputStream 就会返回null

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

到此这篇关于解决调用ftpClient.retrieveFileStream(String remoteFilePath)第二次读取为空问题的文章就介绍到这了,更多相关ftpClient.retrieveFileStream(String remoteFilePath)读取为空内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java生成读取条形码和二维码的简单示例

    Java生成读取条形码和二维码的简单示例

    条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的规则排列,用来表示一组信息的图形标识符,而二维码大家应该都很熟悉了,这篇文章主要给大家介绍了关于Java生成读取条形码和二维码的相关资料,需要的朋友可以参考下
    2021-07-07
  • Java 腾讯验证码平台使用实例

    Java 腾讯验证码平台使用实例

    这篇文章主要介绍了Java 腾讯验证码平台使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 一篇文章带你入门java代理模式

    一篇文章带你入门java代理模式

    这篇文章主要介绍了Java代理模式,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2021-08-08
  • Java8函数式接口的基础学习教程

    Java8函数式接口的基础学习教程

    这篇文章主要给大家介绍了关于Java8函数式接口基础学习的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java状态机方案解决订单状态扭转示例详解

    java状态机方案解决订单状态扭转示例详解

    这篇文章主要为大家介绍了java状态机方案解决订单状态扭转示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java基础篇之反射机制示例详解

    Java基础篇之反射机制示例详解

    反射是Java可以提供的一个灵活又强大的功能,使用Java反射,您可以知道这个类在运行时具有什么属性和方法,也可以修改属性,调用方法,创建类的实例,这篇文章主要给大家介绍了关于Java基础篇之反射机制的相关资料,需要的朋友可以参考下
    2021-11-11
  • java分布式面试接口如何保证幂等及概念理解

    java分布式面试接口如何保证幂等及概念理解

    这篇文章主要为大家介绍了java分布式面试中接口如何保证幂等的问题解答以及概念描述,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Java中list.contains()的用法及拓展

    Java中list.contains()的用法及拓展

    List集合相信大家在开发过程中几乎都会用到,有时候难免会遇到集合里的数据是重复的,需要进行去除,下面这篇文章主要给大家介绍了关于Java中list.contains()的用法及拓展的相关资料,需要的朋友可以参考下
    2023-03-03
  • MyBatis实现递归查询的方法详解

    MyBatis实现递归查询的方法详解

    在项目开发过程中,往往会遇到多级菜单、分类等多层级结构数据的查询。本文就来为大家讲讲MyBatis实现递归查询的方法,感兴趣的可以动手尝试一下
    2022-08-08
  • java stringbuffer的用法示例

    java stringbuffer的用法示例

    这篇文章主要介绍了java stringbuffer的用法示例,字符串缓冲区,是一个容器(当返回到的是String时而且长度不确定,数据类型不确定时就可以用StringBuffer)其实底层还是数组,只是被封装了,对外提供了方法,初始容量为16个字符
    2014-01-01

最新评论