本篇技术博客用于记录基于FTP编程对FTP服务器进行的一系列操作步骤的整理与总结:
获取并展示目录中的所有文件。
创建个人目录并切换至个人目录。
基于FTP编程实现文件的上传操作。
基于FTP编程实现文件的下载操作。
对控制台展示文件创建时间以及中文乱码问题的细节处理。
目录
一. 实现概述
既然我们是对FTP服务器进行操作,那么我们编写的程序则是基于FTP协议的客户端程序(FTPClient),其中实现了一些对服务器的操作。
基于面向对象的设计思想,必须先实例化出FTPClient对象继续进行,然后连接服务器并验证身份后去实现各种不同的操作。
tips: 基于此协议进行编程需要拓展包commons-net-3.6.jar的支持。
二. 实现细节
1. 获取并展示目录中的所有文件
第一步,创建基于FTP协议访问文件服务器的客户端对象。
FTPClient ftpClient = new FTPClient(); // 创建客户端对象
第二步,连接到FTP服务器并验证用户名和密码。
- 通过ftpClient对象的connect()方法连接至服务器,第一个参数是服务器的主机号,第二个参数是端口号。
- 通过ftpClient对象的login()方法验证用户名和密码。
// 连接服务器并验证身份
ftpClient.connect("这个地方是你要访问的服务器的主机地址,我才不会给你我的!!!",21);
ftpClient.login("用户名","密码");
第三步,进入到服务器的指定目录后,获取所有文件并展示。
- 还是通过ftpClient对象,调用它的listFiles()方法,该方法会返回一个FTPFile类型的数组,用于存放指定目录下的所有文件。
- 拿到这个数组之后,事情就开始变得枯燥乏味了: 遍历这个数组,并输出每次被遍历文件的文件名,创建时间以及文件大小。
//获取当前目录中的所有文件
FTPFile[] ftpList = ftpClient.listFiles();
for(FTPFile file : ftpList) {
System.out.println("文件名: "+file.getName());
System.out.println("文件大小: "+file.getSize()+"字节");
System.out.println("创建时间: "+file.getTimestamp());
}
运行成功后控制台显示所有文件信息:
2. 创建个人目录并切换至个人目录
调用ftpClient对象的changeWorkingDirectory()方法来切换至指定的工作目录,该方法的返回值是一个布尔值,切换成功则为true,否则是false。
我们在进入一个未曾访问过的服务器时,显然个人的工作目录是不存在的,就要通过ftpClient对象的makeDirectory()方法创建个人目录,再切换至个人目录。
boolean isChanged = ftpClient.changeWorkingDirectory("个人目录名称"); // 切换至个人目录
// 如果不存在,则创建,然后切换
if(!isChanged) {
// 创建个人目录
ftpClient.makeDirectory("个人目录名称");
//切换至个人目录
ftpClient.changeWorkingDirectory("个人目录名称");
}
System.out.println(ftpClient.printWorkingDirectory()); //控制台显示个人目录名称
3. 实现文件上传至个人目录
第一步,实例化FTPClient对象之后,连接服务器并验证身份。
// 创建基于FTP协议访问文件服务器的客户端对象
FTPClient ftpClient = new FTPClient();
// 连接服务器并验证身份
ftpClient.connect("",21);
ftpClient.login("", "");
第二步,切换到个人目录。
boolean isChanged = ftpClient.changeWorkingDirectory("");
if(!isChanged) {
// 创建个人目录
ftpClient.makeDirectory("");
//切换至个人目录
ftpClient.changeWorkingDirectory("");
}
System.out.println(ftpClient.printWorkingDirectory());
第三步,文件上传。
首先设置要上传的文件类型: 调用ftpClient对象的setFileType()方法,传进FTPClient类中的常量值。调用ftpCLient对象的storeFile()方法实现上传功能。参数1是文件的保存名称,参数2传入一个本地文件的输入流。该方法的返回值也是一个布尔类型,最后输出这个返回值以验证是否上传成功。
该输入流定义在try(FileInputStream fis = new FileInputStream("")){}
// 第三步: 文件上传
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 设置文件类型
//存文件至FTP服务器
// 参数1: FTP文件的保存名称
// 参数2: 本地文件输入流
boolean isStore = ftpClient.storeFile("文件名", fis);
System.out.println(isStore);
运行成功后,控制台输出工作目录以及上传结果。
4. 实现文件下载至指定目录
与上传功能的前两步一样。
实现下载功能调用ftpClient的retrieveFile()方法,第一个参数表示想要下载的文件的文件名称,第二个参数传入一个文件输出流。
最后输出下载是否成功。
最后添加finally块断开与服务器的连接,并处理其异常。
输出流定义在了try(FileOutputStream fos = new FileOutputStream("d:\\file\\download\\"+System.currentTimeMillis()+".jpg")) {} 中。
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
boolean isRetrieved = ftpClient.retrieveFile("",fos);
System.out.println("下载成功?"+isRetrieved);
finally {
try {
// 断开连接
ftpClient.disconnect();
} catch (IOException e) {
// TODO Auto-generated catch block
ftpClient=null;
}
}
下载成功后控制台输出结果,并下载到了指定的目录下。
5. 对控制台展示文件创建时间以及中文乱码问题的细节处理
在向控制台输出所有文件时,出现了中文乱码问题和时间格式未处理的问题。
解决方式: 将文件名赋给一个新的字符串,并对其重新编码。
String fileName = file.getName();
fileName = new String(fileName.getBytes("iso-8859-1"),"gb2312");
System.out.println("文件名: "+fileName);
定义一个SimpleDateFormat对象,规定日期的格式,在循环中调用file.getTimestamp().getTime()方法得到日期对象date,将其传入fmt.format(date)中输出正确的日期时间。
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
Date date = file.getTimestamp().getTime();
System.out.println("创建时间: "+fmt.format(date));
以上就是对基于FTP协议编程案例的整理与总结,别忘了每一个功能整体都要处理异常。