如何从不同目录的 FTP 检索文件名 - 看起来像 FTP 关闭连接,如果检测到洪水请求
代码很简单
public List<String> getPaths(String path, LocalDate date) {
try {
val listFiles = ftp.listFiles(path);
return Arrays.stream(listFiles)
.parallel()
.filter(f->f.getTimestamp().getTime().toInstant().isAfter(date.atStartOfDay(ZoneId.systemDefault()).toInstant()))
.map(FTPFile::getName)
.collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
return Collections.emptyList();
}
}
和
public List<String> getPurchaseList(LocalDate date) {
try (FTPClientWrapper wrapper = new FTPClientWrapper(
host, port, login, password)
) {
wrapper.connect();
val regionList = wrapper.readFile(dir, fileName);
val dirList = regionList.stream()
.flatMap(x -> purchaseTypes.stream().map(y -> String.format("%s/%s/%s/%s", dir, x, y, folder)))
.collect(Collectors.toList());
return dirList.stream().flatMap(d -> wrapper.getPaths(d, date).stream())
.collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
return Collections.singletonList(e.getMessage());
}
}
如果我打电话给
getPurchaseList
如果失败:
SocketException:连接被对等方重置:套接字写入错误
如果我在
parallelStream
使用 regionList.stream
则会失败:
org.apache.commons.net.MalformedServerReplyException:无法解析响应代码。
服务器回复:e227 进入被动模式 (95,167,245,94,117,237)
有没有办法解析FTP的1000+目录还是不可能?
我使用 Apache Commons Net FTP 客户端。
您无法使用 FTP 协议通过一个连接并行下载多个文件。一般来说,您不能从多个线程并行使用一个连接来执行任何操作。
您必须为每个线程打开单独的连接。在您的情况下,您将需要实现一个连接池。