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