记录一次对FTP服务器文件内容

通过Java程序对FTP服务器文件处理:连接,上传,下载,读取,移动文件等。

需求描述:今天接到一个任务,在Java项目中,读取FTP服务器上的一些文件,进行一些业务操作。处理完之后,将读取过的文件移动到其他目录里面。这就是我需求。

记录一下使用过程:这里使用的是 org.apache.commons.net.ftp.FTP 这个FTP处理包。

碰到的几个你可能看这篇文章要解决的碰到的问题,提前说下解决方案:

  1. 完全不知道FTP的API如何使用,无从下手?(直接看方法就行了,很简单)

  2. 访问服务器的时候连接成功,但是使用ListFile()获取不到任何文件?(就是第三个问题描述的)

  3. 想要移动FTP服务器里的文件,如何办?(我使用了Rename操作来完成的。把原有的名字)

  4. 具体业务实现。(你自己厘清自己的实现思路,无论是读取指定文件夹的内容,还是上传或者下载,亦或者是对文件名处理,split拼接,判断指定类型等等。都不是什么难的操作。按照自己的需求,自己去设计实现吧。)

  5. 上传下载读取的话,都是使用流的操作。(看代码吧。)

  6. 聊一下关于修改FTP工作空间的操作和设置数据传输模式。(这个先简单的提供两行代码,可能就已经能够解决你的疑问了)

//修改工作目录: 就是说,你要处理哪里的文件什么的。看一下Doc就知道了。
ftpClient.changeWorkingDirectory(pathname);
//开启本地传输模式。(还有其他几种模式。Doc文档中有。自行查阅)
ftpClient.enterLocalPassiveMode();

我这里提炼出来了几个方法,新手使用的话,或者有问题的看代码自行参悟吧。比较简单,这里也主要就是对代码上的记录。(为了保护隐私,隐藏了一些隐私数据和业务处理类。)

关于代码,先说注意事项:

  1. 用完连接,记得关。
  2. 用完流,记得关。
  3. 有异常,记得处理。

下面是具体的代码:

  1. 建立FTP连接。
public FTPClient ftpClient = null;
//ftp服务器IP
public String hostname = "XXX10.1001.11";
//ftp服务器端口号默认为21
public Integer port = XXX;
//ftp登录账号
public String username = "XXX";
//ftp登录密码
public String password = "XXX"; public void initFtpClient() {
ftpClient = new FTPClient();
ftpClient.setControlEncoding("utf-8");
try {
System.out.println("connecting...ftp服务器:"+hostname+":"+port);
ftpClient.connect(hostname, port); //连接ftp服务器
ftpClient.login(username, password); //登录ftp服务器
int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
if(!FTPReply.isPositiveCompletion(replyCode)){
System.out.println("connect failed...ftp服务器:"+hostname+":"+port);
}
System.out.println("connect successfu...ftp服务器:"+hostname+":"+port);
}catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}

调用完 intFTPClient()方法之后,就可以使用ftpClient 来操作FTP服务器了。

  1. 上传.
     /**
* 上传文件
* @param pathname ftp服务保存地址
* @param fileName 上传到ftp的文件名
* @param originfilename 待上传文件的名称(绝对地址) *
* @return*
**/ public boolean uploadFile( String pathname, String fileName,String originfilename){
boolean flag = false;
InputStream inputStream = null;
try{
System.out.println("开始上传文件");
inputStream = new FileInputStream(new File(originfilename));
initFtpClient(); ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.enterLocalPassiveMode();
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
System.out.println("上传文件成功");
}catch (Exception e) {
System.out.println("上传文件失败");
e.printStackTrace();
return false;
}finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
flag = false;
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
flag = false;
}
}
}
return flag;
}
  1. 下载
//我这里在读到文件流的时候,没有保存到本地,直接在程序里面读取转换里面的内容,继续使用了。
//如果有需要的话,我简单的说下思路。就是 用 ftpClient调用指定文件下的文件,调用 FTPFile[] ftpFileArr = ftpClient.listFiles(path);
//后续 InputStream in = ftpClient.retrieveFileStream(fileName)。 获取到具体的文件流。然后后续操作 保存流到本地即可。
  1. 移动文件(通过Rename完成)
     /**
*
* @param nameSet 需要移动的文件目录清单
* @param fromPath 从哪个目录移动
* @param toPath 要移动的目录(从根目录开始写。如:/code/yes/:根目录下的code目录下的yes目录
* @return 返回成功或者失败
* 注意:目录的话,以/结尾
*/
public boolean moveFile(List<String> nameSet,String fromPath,String toPath){ //name格式:/code/yesdawaTest1.txt 、/code/yesdawaTest2.txt
if (nameSet != null && nameSet.size() > 0) {
for (String s : nameSet) {
try {
//获取连接:因为一次连接改多个文件只能有一个生效。这里每次修改文件的时候,获取一次新的链接
initFtpClient();
//改变工作目录
ftpClient.changeWorkingDirectory(fromPath);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); String[] split = s.split("/");
String name = "";
if (split.length > 0) {
name = split[split.length - 1];
}
boolean rename = ftpClient.rename(name, toPath + name);
if (rename) {
System.out.println(name + "成功移动到:" + toPath + name);
}
ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
}
return true;
}
  1. 对文件名或文件类型的处理和判断。(仅供参考)
     //检查指定/path目录下,是否有.txt结尾的文件。如果有,返回符合要求的.
/**
*
* @param path:要查找的文件目录,如 /code:根目录下的code目录
* @param ext:要查找的文件类型扩展名,如 .txt
* @return 返回:符合查找要求的 文件名清单。
*
* 返回的 文件名清单:可以先用于处理数据,然后再处理数据成功后,移动这些文件到其他目录下。
*/
public List<String> checkExistFile(String path, String ext){ //定义一个返回集合:
List<String> tNameSet = new ArrayList<>();
//连接服务器
initFtpClient();
try {
//改变工作目录
ftpClient.changeWorkingDirectory(path);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); String[] strings = ftpClient.listNames(path);
if (strings.length > 0) {
for (String string : strings) {
//如果文件名的长度(带后缀名的)>4 . 才可能是 .txt 结尾的。
if (string.length() > ext.length()) {
//取得文件后缀名
String substring = string.substring(string.length() - ext.length());
if (ext.equals(substring)) {
System.out.println("目前正在处理文件:" + string);
tNameSet.add(string);
}
}
}
}
ftpClient.logout();
} catch (IOException e) {
System.out.println("读取:"+path+" 目录失败");
e.printStackTrace();
} //返回:符合要求的文件 名字 清单
return tNameSet;
}
  1. 关闭ftp连接
     /**
* 关闭FTP服务链接
* @throws IOException
*/
public static void disConnection(FTPClient ftpClient){
try {
if(ftpClient.isConnected()){
ftpClient.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}

OK,以上就是所有问题,有问题可以发邮件联系:16637462812@163.com。 欢迎沟通交流。

通过JAVA对FTP服务器连接,上传,下载,读取,移动文件等的更多相关文章

  1. Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】

    []如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...

  2. Android连接socket服务器上传下载多个文件

    android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { ;// 端口号,必须与客户端一致 ...

  3. Python 一键上传下载&一键提交文件到SVN入基线工具

    一键上传下载&一键提交文件到SVN入基线工具   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用说明 1   注: 根据我司项目规则订制的一套工具,集成以下功能,源码 ...

  4. ServerU FTP服务器无法上传中文名文件怎么办

    erverU是一款非常流行的FTP服务器.最新版本的默认是utf-8编码,对中文支持不够友好,容易发生无法上传本地文件名称包含中文的文件. 工具/原料   server-u 方法/步骤     进入S ...

  5. python中使用paramiko模块并实现远程连接服务器执行上传下载

    paramiko模块 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系 ...

  6. java 实现Serv-U FTP 和 SFTP 上传 下载

    两种ftp使用java的实现方式 ,代码都已测试 第一种:Serv-U FTP 先决条件: 1.Serv-U FTP服务器搭建成功. 2.jar包需要:版本不限制 <!--ftp上传需要的jar ...

  7. [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹

    摘要 上篇文章介绍了如何为ftp添加虚拟用户,本篇将继续实践如何上传,下载文件. 上传 使用xftp客户端上传文件,如图所示 此时上传状态报错,查看详情 从错误看出是应为无法创建文件造成的.那么我们就 ...

  8. 配置ftp服务器只能上传不能进行其他操作

    又到期末考试了,今年当了数据挖掘助教,课程有一道编程大作业,需要搭建ftp服务器,实现文件上传,但是禁止下载重命名.服务器系统是ubuntu12.04 server,使用的ftp服务器也是linux下 ...

  9. ftp服务器不能上传文件故障

    1.在客户端lftp命令无法put文件 原因:登陆用户无法读写 ftp服务器的文件夹,在服务器上增加权限  chmod 777  即可 还有一种方法:在 vsftp的配置文件里,设置可匿名读写

随机推荐

  1. kafka学习笔记(二)kafka的基本使用

    概述 第一篇随笔从消息队列的定义和各种应用,以及kafka的分类定义和基本知识,第二篇就写一篇关于kafka的基本实际配置和使用的随笔,包括kafka的集群参数的配置,生产者使用机制,消费者使用机制. ...

  2. Easticsearch概述(API使用)二

    Rest简介 一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务端互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制 Rest的操作分为以 ...

  3. 《剑指offer》面试题53 - I. 在排序数组中查找数字 I

    问题描述 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8, ...

  4. linux中链接错误的时候,快速找到缺失的符号在哪个库中

    编译一个opencv程序,链接的时候出现大量的如下错误: /home/admin/opencv/opencv-master/modules/imgproc/src/color_lab.cpp:23: ...

  5. 【记录一个问题】android下opencl中的event.getProfilingInfo()测速时间并不准确

    使用了类似的代码来做android下opencl的时间测试: cl::CommandQueue queue(context, devices[0], CL_QUEUE_PROFILING_ENABLE ...

  6. manjaro20安装TIM

    安装 yaourt -S deepin-wine-tim 失败 yaourt -S deepin.qq.office 成功,但是tim版本没有待办,版本比较旧. 配置分辨率 https://blog. ...

  7. JUC之文章整理以及汇总

    JUC文章汇总 JUC部分将学习<JUC并发编程的艺术>和<尚硅谷-大厂必备技术之JUC并发编程>进行博客的整理,各文章中也会不断的完善和丰富. JUC概述 JUC的视频学习和 ...

  8. ajax返回获取的值在其他地方获取

    继续上个问题的后续问题,因为要获取token进行身份验证,但是又不想写死token值,通过以下方式解决: 1.定义一个分离出来的方法. 2.定义一个全局变量.局部变量. 3.把ajax改成同步的.as ...

  9. 自动化部署:在Windows平台安装Jenkins

    在软件开发中经常会提到持续集成Continuous Integration(CI)和持续交付Continuous Delivery(CD).其中Jenkins是一个开源软件项目,是基于Java开发的一 ...

  10. python开发之函数

    转:https://www.tuicool.com/wx/vEVrqeR 06 python开发之函数 博客园精华区12-12 20:56 06 python开发之函数 目录 6.2 调用函数与函数返 ...