循环FTP目录,获取每个文件夹下最新的一个文件。只有第一次是正常返回,之后的循环获取不到文件信息,打印工作目录为空
完整方法如下:
/**
* 获取最近的作业状态
*
* @return
*/
@Override
public Result getTaskInfo() {
String taskDir = ftpProperties.getTaskDir();
FTPUtil ftpUtil = new FTPUtil();
FTPClient client = null;
Gson gson = new Gson();
Map<String, Object> map = new HashMap<>();
try {
client = ftpUtil.getFTPClient(ftpProperties.getFtpHost(), ftpProperties.getFtpPort(),
ftpProperties.getUserName(), ftpProperties.getPassword());
//获取当月最新的记录文件
String year = DateUtils.getYear().toString();
String month = DateUtils.getMonth();
String curr = taskDir + "/" + year + "/" + month + "/";
client.enterLocalPassiveMode();
FTPFile[] ftpFiles = client.listFiles(curr);
//获取最新的数据
for (FTPFile ftpFile : ftpFiles) {
List<TaskInfoVo> list = new ArrayList<>();
String filePath = curr + ftpFile.getName();
System.out.println("dir: " + filePath);
//切换ftp目录,避免循环中不能正常获取其他目录下的文件
boolean change = client.changeWorkingDirectory(filePath);
log.info("切换目录[{}] {}", filePath, change ? "成功" : "失败");
if (!change) {
log.error("切换工作目录失败,路径为:{}", filePath);
continue;
}
System.out.println("当前ftp路径: " + client.printWorkingDirectory());
client.enterLocalPassiveMode();
FTPFile[] files = client.listFiles(filePath);
if (files.length == 0) {
log.error("未查询到数据!{}", filePath);
continue;
}
FTPFile lastModifyFile = Arrays.stream(files).max(Comparator.comparing(k -> k.getTimestamp().getTimeInMillis())).get();
log.info("[{}]最新文件:{}", ftpFile.getName(), lastModifyFile.getName());
filePath = filePath + "/" + lastModifyFile.getName();
InputStream ftpFileStream = ftpUtil.getFTPFileStream(client, filePath);
JSONArray dataArr = JSONUtils.inputStreamToJsonArray(ftpFileStream);
for (Object o : dataArr) {
list.add(gson.fromJson(gson.toJson(o), TaskInfoVo.class));
}
map.put(ftpFile.getName(), list);
}
} catch (Exception e) {
e.printStackTrace();
log.error("FTP文件解析异常!{}", e.getMessage());
} finally {
ftpUtil.closeFTP(client);
}
return Result.success(map);
}