FTPClient使用ftpClient.retrieveFileStream连续读取InputStream失败原因

  使用FTPClient的ftpClient.retrieveFileStream连续读取InputStream来做非后缀名方式验证文件类型,代码如下:

 

private final static String CHECK_FILE_SUFFIX = ".doc,.docx,.xlsx,.xls,.mp4,.mp3,.ppt,.pptx,.pdf";//后缀名方式检查文件类型
/**
* ftp获取目录下的文件
*
* @param dir 路径
* @throws IOException
*/
public static List<String> getFtpFileNameListBySuffix(FTPClient ftpClient, String dir) throws IOException {
List<String> fileList = new ArrayList<>();
try {
FTPFile[] files = ftpClient.listFiles(dir);
if (files != null && files.length > 0) {
for (FTPFile file : files) {
String fileName = file.getName();
if (!".".equals(fileName) && !"..".equals(fileName) && !file.isDirectory()) {
String suffixName = fileName.contains(".") ? fileName.substring(fileName.lastIndexOf("."), fileName.length()) : fileName;
InputStream inputStream = ftpClient.retrieveFileStream(dir.equals("/") ? dir.concat(fileName) : dir.concat("/").concat(fileName));
//后缀名和非后缀名方式验证文件格式为text和csv
if (!checkFileType(inputStream) && !CHECK_FILE_SUFFIX.contains(suffixName.toLowerCase(Locale.ROOT))) {
fileList.add(fileName);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return fileList;
}


调用以上方法,当目录下存在多个文件时,读取到第三个文件,开始报如下错误:

java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:894)
at org.apache.commons.net.ftp.FTPClient._retrieveFileStream(FTPClient.java:1927)
at org.apache.commons.net.ftp.FTPClient.retrieveFileStream(FTPClient.java:1918)
at com.shsnc.dbtdemo.common.utils.FtpUtil.getFtpFileNameListBySuffix(FtpUtil.java:142)

 

 

报错分析:

读完InputStream并使用完后必须关闭它,如果不关闭后续命令会抛异常;流关闭后,必须调用completePendingCommand方法,

completePendingCommand和检查其返回值以验证是否成功。否则后续命令会抛异常。

 

解决方法:

InputStream流使用完后,需要关闭,然后调用completePendingCommand()方法;

1、inputStream.close();
2、ftpClient.completePendingCommand();




posted @ 2022-06-27 15:43  海盗哥哥  阅读(917)  评论(0编辑  收藏  举报