想写个数据监测的工具,监测数据的流转过程是否有丢失的情况,有个数据来源是SFTP上的文件,需要统计他的文件个数和每个文件下的行数。
用java自带的java.IO.工具试了一下不行。数据流是空的。搞了老半天才找到问题,并解决掉。在此给大家分享一下。可能我的视线流程复杂了。
首先创建并初始化sftp对象。这里我给封装了个工具:
public class SftpUtil { private FTPSClient ftp; private String ftpHost; private int ftpPort; private String ftpUser; private String ftpPassword; public SftpUtil(String ftpHost, int ftpPort, String ftpUser, String ftpPassword){ this.ftpHost = ftpHost; this.ftpPort = ftpPort; this.ftpUser = ftpUser; this.ftpPassword = ftpPassword; } public void login(){ try { System.setProperty("jdk.tls.useExtendedMasterSecret", "false"); ftp = new SSLSessionReuseFTPClient(); // // Connect to host ftp.connect(ftpHost, 21); int reply = ftp.getReplyCode(); if (FTPReply.isPositiveCompletion(reply)) { // Login if (ftp.login(ftpUser, ftpPassword)) { // Set protection buffer size ftp.execPBSZ(0); // Set data channel protection to private ftp.execPROT("P"); ftp.setControlEncoding("UTF-8"); // Enter local passive mode ftp.enterLocalPassiveMode(); } } } catch (IOException e) { e.printStackTrace(); } } /** * 列出指定目录下的文件名称 * @param ftpPath * @return */ public FTPFile[] listFile(String ftpPath){ FTPFile[] ftpFiles = null; try { ftpFiles = ftp.listFiles(ftpPath); } catch (IOException e) { e.printStackTrace(); } return ftpFiles; } /** * 将文件转换成数据流; */ public InputStream getFtpFileInputStream(String path){ InputStream inputStream = null; try { inputStream = ftp.retrieveFileStream(new String(path.getBytes(StandardCharsets.UTF_8), FTP.DEFAULT_CONTROL_ENCODING)); } catch (IOException e) { e.printStackTrace(); } return inputStream; }最下边的方法,就这个,先将ftpfile转换成inputstream,往后就可以跟操作普通文件一样处理了。
