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 ...
随机推荐
- linux 操作系统级别监控 df 命令
df命令可以查看当前系统磁盘空间的使用情况 命令:df -h du -sh * 查看目录文件暂用磁盘大小 如果磁盘空间不够,需清理磁盘 磁盘速度测试,如果磁盘性能不好,性能测试数据会不准确(读写速度) ...
- JS 防抖和节流
防抖和节流 在处理高频事件,类似于window的resize或者scorll,或者input输入校验等操作时.如果直接执行事件处理器,会增大浏览器的负担,严重的直接卡死,用户体验非常不好. 面对这种情 ...
- 实现非管理型UPS在linux主机上的停电自动关机
买了个山特的SANTAK TG-BOX 850 UPS,自带USB通讯线缆.本以为官方软件提供Linux下的CLI命令以监控UPS状态. 官网提供的下载链接巨慢无比不说,CLI下只提供了安装脚本,没有 ...
- git windows 安装 - Github同步 / Vscode源代码管理:Git 安装操作
github上创建立一个项目 登录github网站,在github首页,点击页面右下角"New Repository" 最后点击"Create Repository&qu ...
- 使用Hexo搭建个人博客并部署到GitHub或码云上全过程
一.前言 如上图所示:GitHub有Github Pages,而码云也有码云 Pages 1.Github Pages或Gitee Pages是什么呢? Github Pages或者Gitee Pag ...
- seo搜索引擎的优化方法
现在互联网的入口,一般都是被搜索引擎霸占.所以我们要想让别人搜索时,优先看到我们的网站.有两种方法: 1.竞价排名.这是需要钱的,给的钱越多,排名越靠前.参考某度.. 2.不想花钱,就使用seo搜索引 ...
- JQuery学习笔记之手网琴效果
这种东西在网上多的是,最近在学JQuery,所以就写了个随笔 <!DOCTYPE html> <html lang="en"> <head> & ...
- Spring Boot (七): Mybatis极简配置
Spring Boot (七): Mybatis极简配置 1. 前言 ORM 框架的目的是简化编程中的数据库操作,经过这么多年的发展,基本上活到现在的就剩下两家了,一个是宣称可以不用写 SQL 的 H ...
- idea springBoot 配置devtools实现热部署
1.pom文件依赖引入 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...
- TCP/UDP的小事情
UDP: 没有复杂的控制机制,面向无连接的通信服务. 常用于: 包总量少的通信 音视频传输(即时通信) TCP: 对传输.发送.通信.进行控制的协议.面向有连接的协议,只有在确认通信对端存在时才会发送 ...