FTPClient连续读取文件
最近在使用FTPClient连续读取ftp上的多个文件内容时,遇到了两个问题:
1. 在for循环中,FTPClient只能读取到第一个文件内容,读取第二个时遇到NPE问题。
2. 遇到程序锁死。
下面就遇到问题进行还原分析,并提供解决办法:
现在使用FTPClient读取ftp服务器/aaa/bbb/目录下a.txt,b.txt两个文件

问题1:

通过Debug发现在读取第一个文件前FTPClient的_replyCode=226(226 Transter complete.) 数据传输完的状态,当开始读第一个文件之后_replyCode=125(125 Data connection already open; Transter starting.)数据传输开始正在传输,表明第一文件还没有传输完,导致读第二个文件时inputStrean为null。



解决办法是在读完第一文件之后,执行 ftpClient.completePendingCommand(); 告诉FTPClient数据已经传完。
问题2:
ftpClient.completePendingCommand(); 在读取执行执行造成锁死。
解决办法 ftpClient.completePendingCommand(); 只能在数据传输之后执行。
最后贴上完整的代码:
package com.shipc.demo.ftp; import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply; import java.io.*; /**
* @author shipc 2019/10/24 10:00
* @version 1.0
*/
public class TestFTP { private FTPClient connectServer() {
FTPClient ftpClient = new FTPClient();
ftpClient.setConnectTimeout(1000 * 60 * 30);
ftpClient.setControlEncoding("UTF-8");
ftpClient.enterLocalPassiveMode(); //设置被动模式,文件传输端口设置
try {
ftpClient.connect("172.17.0.16", 21);
ftpClient.login("ftp-user", "123456");
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 设置文件传输模式为二进制
final int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
ftpClient.disconnect();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return ftpClient;
} private void readFiles(FTPClient ftpClient) throws IOException {
ftpClient.changeWorkingDirectory("/aaa/bbb");
final FTPFile[] ftpFiles = ftpClient.listFiles();
for (FTPFile ftpFile : ftpFiles) {
if (ftpFile.isFile()) {
System.out.println("********文件" + ftpFile.getName() + "的内容如下**********");
// ftpClient.completePendingCommand(); // 一定不能在读之前执行,否则会锁死 InputStream inputStream = ftpClient.retrieveFileStream(ftpFile.getName());
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
while (true) {
final String s = reader.readLine();
if (s == null) {
break;
}
System.out.println(s);
}
}
inputStream.close();
ftpClient.completePendingCommand(); // 每当读完一个文件时,要执行该语句
}
}
} public static void main(String[] args) {
final TestFTP testFTP = new TestFTP();
FTPClient ftpClient = testFTP.connectServer();
try {
testFTP.readFiles(ftpClient);
} catch (IOException e) {
e.printStackTrace();
}
}
}
FTPClient连续读取文件的更多相关文章
- HTML5 文件域+FileReader 分段读取文件并上传到服务器(六)
说明:使用Ajax方式上传,文件不能过大,最好小于三四百兆,因为过多的连续Ajax请求会使后台崩溃,获取InputStream中数据会为空,尤其在Google浏览器测试过程中. 1.简单分段读取文件为 ...
- 使用ftp读取文件夹中的多个文件,并删除
public class FTPUtils { private static final Logger LOG = LoggerFactory.getLogger(FTPUtils.class); / ...
- 解决FTPClient上传文件为空,显示0字节
JAVA使用FTPClient上传文件时总是为空,而使用FileZilla客户端时却不会. 后来查了下资料,FTP服务器有被动模式和主动模式.(具体查另外资料) 在JAVA中将FTPClient设置为 ...
- Matlab如何循环读取文件
循环读取图片第一种方法①List =dir('*.jpg'); %如需其它图片格式支持,可以自己[重载dir()]函数,实现查找所有图片文件的功能,%如果图片是其它路径,可以用 ["路径&q ...
- python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件
python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 python操作txt文件中 ...
- C++输入cin,输出cout,换行endl,getline连续读取字符
简记:cin=键盘,cout=屏幕. >>和<<指向代表数据流动方向.<<是流插入运算符,右操作数(运算符右边的值)会被插入到输出流中. 首先要包含:#includ ...
- HDFS读文件过程分析:读取文件的Block数据
转自http://shiyanjun.cn/archives/962.html 我们可以从java.io.InputStream类中看到,抽象出一个read方法,用来读取已经打开的InputStrea ...
- python numpy实现多次循环读取文件 等间隔过滤数据
numpy的np.fromfile会出现如下的问题,只能一次性读取文件的内容,不能追加读取,连续两次的np.fromfile读到的东西一样 如果数据文件太大(几个G或以上)不能一次性全读进去,需要追加 ...
- Java 创建文件夹和文件,字符串写入文件,读取文件
两个函数如下: TextToFile(..)函数:将字符串写入给定文本文件: createDir(..)函数:创建一个文件夹,有判别是否存在的功能. public void TextToFile(fi ...
随机推荐
- Day 19 磁盘管理
1.磁盘的基本概念 1.什么是磁盘 磁盘(disk)是指利用磁记录技术存储数据的存储器. 磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失. *绝大多数人对硬盘都不陌 ...
- [C++]类的设计(2)——拷贝控制(阻止拷贝)
1.阻止拷贝的原因:对于某些类来说,拷贝构造函数和拷贝赋值运算符没有意义.举例:iostream类阻止了拷贝,以避免多个对象写入或者读取相同的IO缓冲. 2.阻止拷贝的方法有两个:新标准中可以将成 ...
- 这个注册的 IP 网络都不通了,Eureka 注册中心竟然无法踢掉它!
本文导读: 微服务技术架构选型介绍 k8s 容器化部署架构方案 Eureka 注册中心问题场景 问题解决手段及原理剖析 阅读本文建议先了解: 注册中心基本原理 K8s(Kuberneters)基本概念 ...
- Java 代理模式 (二) 动态代理
代理模式 代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式:即通过代理访问目标对象. 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 代理模式的 ...
- let与var的区别
1.let作用域局限于当前代码块 文章中//后面的均为打印结果 代码1: { var str1 = "小花"; let str2 = "小明"; console ...
- java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(下)注解配置,统一错误处理和拦截器
我们上次大致说完了执行流程,也只是说了大致的过程,还有中间会出错的情况我们来处理一下. 统一异常处理 比如我们的运行时异常的500错误.我们来自定义一个类 package com.springmvcb ...
- 基于HTML5 WebGL的工业化3D电子围栏
前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 ...
- C#调用OpenCV开发简易版美图工具
前言 在C#调用OpenCV其实非常简单,因为C#中有很多OPenCV的开源类库. 本文主要介绍在WPF项目中使用OpenCVSharp3-AnyCPU开源类库处理图片,下面我们先来做开发前的准备工作 ...
- asp.net core 自定义中间件【以dapper为例】
在asp.net core开发中.按照国际案例开始.都是先在Nuget安装XXX包.比如我们今天要用到的Dapper nuget里面安装Dapper 1.然后新建一个类文件DapperExtensio ...
- Cannot access a disposed object in ASP.NET Core
Cannot access a disposed object in ASP.NET Core 楠木大叔 导航 常见原因 总结 对于.neter来说,在使用ASP.NET Core的过程中 ...