解决调用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文本、网络等资源

    这篇文章主要介绍了如何更优雅的关闭java文本、网络等资源,在 finally 的关闭代码中,还要再来一个 try/catch,看着是不是很难受,很不优雅,很想干掉这个 finally!,需要的朋友可以参考下
    2019-06-06
  • Java利用Apache POI实现Excel文件读写操作

    Java利用Apache POI实现Excel文件读写操作

    Apache POI是一个用于读写Microsoft Office文件格式的Java库,可以用来读取或写入Excel文件,下面小编就和大家详细讲讲Java借助Apache POI读写Excel的详细代码吧
    2026-02-02
  • Java中equals和hashcode用法

    Java中equals和hashcode用法

    `equals`和`hashCode`方法在Java中密切相关,必须保持一致性,如果两个对象通过`equals`方法相等,它们的`hashCode`也必须相同,这对于基于哈希的数据结构至关重要,因为这些结构依赖哈希值进行快速查找和存储,为了减少哈希冲突
    2025-01-01
  • Java基础知识精通注释与数据类型及常量与变量

    Java基础知识精通注释与数据类型及常量与变量

    本文给大家介绍了Java的注释与数据类型和常量变量,这些都是最基础的知识,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Windows下Java+MyBatis框架+MySQL的开发环境搭建教程

    Windows下Java+MyBatis框架+MySQL的开发环境搭建教程

    这篇文章主要介绍了Windows下Java+MyBatis框架+MySQL的开发环境搭建教程,Mybatis对普通SQL语句的支持非常好,需要的朋友可以参考下
    2016-04-04
  • mybatis-plus多表联查join的实现

    mybatis-plus多表联查join的实现

    本文主要介绍了mybatis-plus多表联查join的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java中使用注解获取和改变Bean的指定变量值

    Java中使用注解获取和改变Bean的指定变量值

    Java有时需要通过自定义注解,获取某Bean的某变量的值,根据业务要求处理数据,然后再把新值设置回Bean的同一变量中,这篇文章介绍了使用注解获取和改变Bean变量值的过程,感兴趣想要详细了解可以参考下文
    2023-05-05
  • 解决MyEclipse中Maven设置jdk版本jdk1.8报错问题

    解决MyEclipse中Maven设置jdk版本jdk1.8报错问题

    今天安装了jdk1.8、tomcat8、和maven3.5.2,弄好后在myeclipse新建了一个maven项目,项目默认是jdk1.5,改成jdk1.8后项目报错
    2018-10-10
  • java读取图片并转化为二进制字符串的实现方法

    java读取图片并转化为二进制字符串的实现方法

    这篇文章主要介绍了java读取图片并转化为二进制字符串的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • SpringBoot+Docker+K8s云原生部署全流程(从零到发布)

    SpringBoot+Docker+K8s云原生部署全流程(从零到发布)

    本文详解了SpringBoot项目从开发到基于Docker容器化,再通过K8s实现云原生部署的全流程,涵盖环境搭建、镜像构建、服务部署及CI/CD自动化,提升应用部署效率与可维护性,需要的朋友跟随小编一起学习吧
    2025-08-08

最新评论