public void readFire(FireFtpConfig ftpConfig) {
FTPClient ftpClient = new FTPClient();
Date now = new Date();
try {
log.debug("登录ftp:{}", ftpConfig.getHost());
ftpClient.connect(ftpConfig.getHost(), ftpConfig.getPort());
ftpClient.login(ftpConfig.getUsername(), ftpConfig.getPassword());
ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setControlEncoding("UTF-8");
ftpClient.enterLocalPassiveMode();
log.debug("登录成功");
String dir = DatePatternUtil.get("20180925").format(now);
// String rootPath = ftpConfig.getDirpath() + dir;
String rootPath = ftpConfig.getDirpath() + "20181000";
String[] files = ftpClient.listNames(rootPath);
List<String> dataNameList = FirePointReadUtil.readFilePath(ftpClient, rootPath);
for (String dataName : dataNameList) {
InputStream inputStream = ftpClient.retrieveFileStream(dataName);
if (dataName.endsWith(".csv") && inputStream != null) {
readFtp(inputStream, now, "csv");
} else if (dataName.endsWith(".rar") && inputStream != null) {
readFtp(inputStream, now, "rar");
}
//这里需要注意,如果不写下面两部,则再次读取得流为null
inputStream.close();
ftpClient.completePendingCommand();
}
} catch (IOException e) {
log.error("读取文件是发生错误", e);
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
下面是递归获取ftp的文件夹下所有文件绝对路径
private static List<String> readFilePath(FTPClient ftpClient, String path) throws IOException {
List<String> paths = new ArrayList();
for (FTPFile file : ftpClient.listFiles(path)) {
if (file.isDirectory()) {
paths.addAll(readFilePath(ftpClient, path + "/" + file.getName()));
}
if (file.isFile()) {
paths.add(path + "/" + file.getName());
}
}
return paths;
}