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 ...
随机推荐
- 关于ClassLoader的使用
了解ClassLoader: /* * 了解类的加载器:ClassLoader * */ @Test public void testClassLoader() { // 获取到系统类加载器,加载用户 ...
- 20 (OC)* GCD、NSOperation、NSThread。多线程
多线程编程技术的优缺点比较 NSThread (抽象层次:低) 优点:轻量级,简单易用,可以直接操作线程对象 缺点: 需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销. C ...
- 微信小程序全局变量的设置、使用、修改
1. 全局变量的设置 在miniprogram > app.js 文件中设置,globalData对象就是存储全局变量的. App({ globalData: { hasLogin: false ...
- 为elastic的索引做快照并恢复快照到新集群
1. 为指定的所有做快照 curl -XPUT "192.168.1.1:9200/_snapshot/my_backup/testindex_20170803?wait_for_compl ...
- 微项目:一步一步带你使用SpringBoot入门(一)
最近放假了,休息的时候不忘写个小项目来玩玩. 如果有需要一起手动做项目的朋友可以和我一起做这个小项目. 做到哪随心所欲.也就一周的事哈哈. *** 开发环境 JDK1.8 JetBrain Intel ...
- Appium与Appium Desktop的区别
Appium-Server的配置,在之前的博文已有介绍,基于Python的Appium环境搭建合集,所以在此处就不详细介绍了.今天主要来分享下Appium-Server和Appium desktop在 ...
- FormatMessage将错误代码转换成对应的字符串
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" int _tmain(int argc, _T ...
- Go语言入门教程(十)之函数
Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...
- Nginx+Tomcat Https SSL部署方案
1.软件版本: nginx-1.15+ tomcat-8.0+ 2.先解决一个疑问:Tomcat到底需不需要配置SSL? 答案:不需要 3.SSL申请 使用腾讯云.阿里云的服务器,会更加方便申请.(申 ...
- MongoDB 学习笔记之 $push,$each,$slice组合使用
$push使用: 使用$push给数组添加2个新成员 db.ArrayTest.updateOne({ "name" : "Bill"},{$push: {&q ...