因工作需要,需要在后台处理一些小文件,比如网页资源到服务器上保存,本来计划使用DFS来进行压缩存储,考虑到需要再次解压生成访问连接,暂时先直接通过FTP直接保存在服务器上。就看了下Java下的ftp上传的实现方法,参照了网上的代码。
这里给出我封装的一个工具类,可以直接使用,应该需要再优化。
使用了Apache的commons-net-1.4.1.jar开源组件。
对应的API地址如下:
http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html

package com.test;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;/*** FTP工具类* @author dq*/
public class FtpUtils {private FTPClient ftpClient = null;private String server;private int port;private String userName;private String userPassword;public FtpUtils(String server, int port, String userName, String userPassword) {this.server = server;this.port = port;this.userName = userName;this.userPassword = userPassword;}/*** 连接服务器* @return 连接成功与否 true:成功, false:失败*/public boolean open() {if (ftpClient != null && ftpClient.isConnected()) {return true;}try {ftpClient = new FTPClient();// 连接ftpClient.connect(this.server, this.port);ftpClient.login(this.userName, this.userPassword);setFtpClient(ftpClient);// 检测连接是否成功int reply = ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {this.close();System.err.println("FTP server refused connection.");System.exit(1);}System.out.println("open FTP success:" + this.server + ";port:" + this.port + ";name:" + this.userName+ ";pwd:" + this.userPassword);ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 设置上传模式.binally  or asciireturn true;} catch (Exception ex) {this.close();ex.printStackTrace();return false;}}/*** 切换到父目录* @return 切换结果 true:成功, false:失败*/private boolean changeToParentDir() {try {return ftpClient.changeToParentDirectory();} catch (IOException e) {e.printStackTrace();return false;}}/*** 改变当前目录到指定目录* @param dir 目的目录* @return 切换结果 true:成功,false:失败*/private boolean cd(String dir) {try {return ftpClient.changeWorkingDirectory(dir);} catch (IOException e) {e.printStackTrace();return false;}}/*** 获取目录下所有的文件名称* * @param filePath 指定的目录* @return 文件列表,或者null*/private FTPFile[] getFileList(String filePath) {try {return ftpClient.listFiles(filePath);} catch (IOException e) {e.printStackTrace();return null;}}/*** 层层切换工作目录* @param ftpPath 目的目录* @return 切换结果*/public boolean changeDir(String ftpPath) {if (!ftpClient.isConnected()) {return false;}try {// 将路径中的斜杠统一char[] chars = ftpPath.toCharArray();StringBuffer sbStr = new StringBuffer(256);for (int i = 0; i < chars.length; i++) {if ('\\' == chars[i]) {sbStr.append('/');} else {sbStr.append(chars[i]);}}ftpPath = sbStr.toString();if (ftpPath.indexOf('/') == -1) {// 只有一层目录ftpClient.changeWorkingDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));} else {// 多层目录循环创建String[] paths = ftpPath.split("/");for (int i = 0; i < paths.length; i++) {ftpClient.changeWorkingDirectory(new String(paths[i].getBytes(), "iso-8859-1"));}}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 循环创建目录,并且创建完目录后,设置工作目录为当前创建的目录下* @param ftpPath 需要创建的目录* @return*/public boolean mkDir(String ftpPath) {if (!ftpClient.isConnected()) {return false;}try {// 将路径中的斜杠统一char[] chars = ftpPath.toCharArray();StringBuffer sbStr = new StringBuffer(256);for (int i = 0; i < chars.length; i++) {if ('\\' == chars[i]) {sbStr.append('/');} else {sbStr.append(chars[i]);}}ftpPath = sbStr.toString();System.out.println("ftpPath:" + ftpPath);if (ftpPath.indexOf('/') == -1) {// 只有一层目录ftpClient.makeDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));ftpClient.changeWorkingDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));} else {// 多层目录循环创建String[] paths = ftpPath.split("/");for (int i = 0; i < paths.length; i++) {ftpClient.makeDirectory(new String(paths[i].getBytes(), "iso-8859-1"));ftpClient.changeWorkingDirectory(new String(paths[i].getBytes(), "iso-8859-1"));}}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 上传文件到FTP服务器* @param localDirectoryAndFileName 本地文件目录和文件名* @param ftpFileName 上传到服务器的文件名* @param ftpDirectory FTP目录如:/path1/pathb2/,如果目录不存在会自动创建目录* @return*/public boolean upload(String localDirectoryAndFileName, String ftpFileName, String ftpDirectory) {if (!ftpClient.isConnected()) {return false;}boolean flag = false;if (ftpClient != null) {File srcFile = new File(localDirectoryAndFileName);FileInputStream fis = null;try {fis = new FileInputStream(srcFile);// 创建目录this.mkDir(ftpDirectory);ftpClient.setBufferSize(100000);ftpClient.setControlEncoding("UTF-8");// 设置文件类型(二进制)ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);// 上传flag = ftpClient.storeFile(new String(ftpFileName.getBytes(), "iso-8859-1"), fis);} catch (Exception e) {this.close();e.printStackTrace();return false;} finally {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}System.out.println("上传文件成功,本地文件名: " + localDirectoryAndFileName + ",上传到目录:" + ftpDirectory + "/" + ftpFileName);return flag;}/*** 从FTP服务器上下载文件* @param ftpDirectoryAndFileName ftp服务器文件路径,以/dir形式开始* @param localDirectoryAndFileName 保存到本地的目录* @return*/public boolean get(String ftpDirectoryAndFileName, String localDirectoryAndFileName) {if (!ftpClient.isConnected()) {return false;}ftpClient.enterLocalPassiveMode(); // Use passive mode as defaulttry {// 将路径中的斜杠统一char[] chars = ftpDirectoryAndFileName.toCharArray();StringBuffer sbStr = new StringBuffer(256);for (int i = 0; i < chars.length; i++) {if ('\\' == chars[i]) {sbStr.append('/');} else {sbStr.append(chars[i]);}}ftpDirectoryAndFileName = sbStr.toString();String filePath = ftpDirectoryAndFileName.substring(0, ftpDirectoryAndFileName.lastIndexOf("/"));String fileName = ftpDirectoryAndFileName.substring(ftpDirectoryAndFileName.lastIndexOf("/") + 1);this.changeDir(filePath);ftpClient.retrieveFile(new String(fileName.getBytes(), "iso-8859-1"),new FileOutputStream(localDirectoryAndFileName)); // download// fileSystem.out.println(ftpClient.getReplyString()); // check resultSystem.out.println("从ftp服务器上下载文件:" + ftpDirectoryAndFileName + ", 保存到:" + localDirectoryAndFileName);return true;} catch (IOException e) {e.printStackTrace();return false;}}/*** 返回FTP目录下的文件列表* @param pathName* @return*/public String[] getFileNameList(String pathName) {try {return ftpClient.listNames(pathName);} catch (IOException e) {e.printStackTrace();return null;}}/*** 删除FTP上的文件* @param ftpDirAndFileName 路径开头不能加/,比如应该是test/filename1* @return*/public boolean deleteFile(String ftpDirAndFileName) {if (!ftpClient.isConnected()) {return false;}try {return ftpClient.deleteFile(ftpDirAndFileName);} catch (IOException e) {e.printStackTrace();return false;}}/*** 删除FTP目录* @param ftpDirectory* @return*/public boolean deleteDirectory(String ftpDirectory) {if (!ftpClient.isConnected()) {return false;}try {return ftpClient.removeDirectory(ftpDirectory);} catch (IOException e) {e.printStackTrace();return false;}}/*** 关闭链接*/public void close() {try {if (ftpClient != null && ftpClient.isConnected()) {ftpClient.disconnect();}System.out.println("成功关闭连接,服务器ip:" + this.server + ", 端口:" + this.port);} catch (Exception e) {e.printStackTrace();}}public FTPClient getFtpClient() {return ftpClient;}public void setFtpClient(FTPClient ftpClient) {this.ftpClient = ftpClient;}public static void main(String[] args) {FtpUtils f = new FtpUtils("192.168.162.100", 21, "uftp", "admin");try {if(f.open()) {String fileName = "测试2.txt";//上传f.upload("d:/1.txt", fileName, "test1");//遍历FTPFile[] list = f.getFileList("test1");for(FTPFile file : list) {String name = file.getName();System.out.println("--" + new String(name.getBytes("iso-8859-1"), "GB2312"));}//只遍历指定目录下的文件名String[] names = f.getFileNameList("test1");for(String name : names) {System.out.println(new String(name.getBytes("iso-8859-1"), "GB2312"));}//下载boolean b = f.get("/test1/测试2.txt", "d:/text.txt");System.out.println(b);//删除String ftpDirAndFileName = "test1/测试.txt";boolean be = f.deleteFile(new String(ftpDirAndFileName.getBytes(), "iso-8859-1"));System.out.println(be);//删除目录boolean delf = f.deleteDirectory("test1");System.out.println(delf);f.close();}} catch (Exception e) {e.printStackTrace();}}
}

代码不难理解,main方法中给出了使用的方式,就当做是记录一下了。

Java FTP工具类相关推荐

  1. 手写一个好用的Java FTP操作工具类

    前言 网上百度了很多FTP的java 工具类,发现文章代码都比较久远,且代码臃肿,即使搜到了代码写的还可以的,封装的常用操作方法不全面,于是自己花了半天实现一个好用的工具类.最初想用java自带的FT ...

  2. Hutool Java常用工具类汇总

    简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". Hu ...

  3. Springboot项目搭建有ftpClientPool的Ftp工具类

    1 前言 最近项目中用到了FTP,于是自己写了一个FTP工具类,现将其分享出来,供大家借鉴使用. FTP工具类的实现可以分为两部分: 基于apache commons-pool2的ObjectPool ...

  4. 【FTP工具类】提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作

    介绍:FTP工具类,提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作. 应用场景: 通过FTP连接需要获取文件目录列表 通过FTP连接读取指定文件内容 递归读取遍历服务器上所有文件 其他功 ...

  5. UrlUtils工具类,Java URL工具类,Java URL链接工具类

    UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...

  6. Java并发工具类(闭锁CountDownLatch)

    并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...

  7. java日期工具类DateUtil

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. DateUtil类 [java] view plain copy package com.util; ...

  8. Java常用工具类StringUtils的常用方法

    Java常用工具类StringUtils的常用方法 1.该工具类是用于操作Java.lang.String类的. 2.StringUtils类在操作字符串是安全的,不会报空指针异常,也正因此,在操作字 ...

  9. 组织机构代码和统一社会信用代码校验规则以及java校验工具类

    组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...

  10. 彻底理解Java并发:Java并发工具类

    本篇内容包括:Java 并发工具类的介绍.使用方式与 Demo,包括了 CountDownLatch(线程计数器).CyclicBarrier(回环栅栏).Semaphore(信号量) 以及 Exch ...

最新文章

  1. [python]目录及文件操作
  2. jfinal linux 乱码,分享JFinal中renderFile方法中文文件名乱码问题的解决办法
  3. VMware vSphere 5.1 群集深入解析(二十六)- 数据存储维护模式汇总
  4. xe7 Unresolved external CSPIN.OBJ
  5. React Native StyleSheet 样式属性
  6. 【DFS】HDU 1364 POJ 1071 Illusive Chase
  7. linux 远程调试
  8. [入门]Ruby on Rails入门教程及开发工具选用
  9. 操作手册模板_挂蓝悬臂浇筑箱梁施工技术操作手册
  10. python widget_python 图形界面
  11. 清朝12位皇帝简介【顺康雍乾嘉道咸同光宣】
  12. 今日头条图片爬取和下载
  13. 支持5G WIFI的串口服务器
  14. Gi t 折磨疯了的SSL证书问题
  15. 在云计算行业内有什么证书比较有名?受市场认可大?
  16. iPad air 1 7.1.2升级IOS 11
  17. SAP MM批次切换
  18. 获取文本文件编码与导出源代码
  19. Windows下安装PyQt(python3.8+PyQt5)
  20. vscode向下复制快捷键更改

热门文章

  1. 微信支付商户平台:商户简称
  2. 武汉大学测绘学院工测带缓和曲线的圆曲线
  3. 硬件产品的成本构成——研发、产品边际成本和服务
  4. 51/stm32单片机软件调试方法与技巧
  5. 远程桌面 中断计算机连接不上,中断远程桌面连接解决方案
  6. 计算机更新后无法远程,重装系统后无法进行远程桌面连接怎么办
  7. 思岚激光雷达+cartographer建图
  8. UML建模和开发预演
  9. 5大主流ASO优化工具
  10. 返回短语的缩写python_邮件缩写短语