java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > ftpClient.retrieveFileStream(String remoteFilePath)读取为空

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

作者: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)读取为空内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

阅读全文