主要演示Java整合FTP后的一些常用基本操作;
    为方便操作,直接使用Maven运行测试;
    在配置文件中引入FTP操作依赖(FTPClient):

    1. <dependency>
    2. <groupId>commons-net</groupId>
    3. <artifactId>commons-net</artifactId>
    4. <version>3.6</version>
    5. </dependency>

    然后直接上代码吧,
    运行类:

    1. import org.apache.commons.net.ftp.FTPClient;
    2. import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. import org.springframework.stereotype.Component;
    4. import java.io.IOException;
    5. import java.util.Scanner;
    6. @Component
    7. @SpringBootApplication
    8. public class App {
    9. public static void main(String[] args) {
    10. FTPClient ftpClient = new FTPClient();
    11. InitFTP initFTP = new InitFTP();
    12. System.out.println("退出请输入exit,输入其他字符继续操作");
    13. while (!"exit".equals(new Scanner(System.in).next())) {
    14. initFTP.initFtpClient(ftpClient);
    15. System.out.println("请输入操作(上传、下载、删除、移动、读取、写入):");
    16. Scanner scanner = new Scanner(System.in);
    17. String next = scanner.next();
    18. if ("上传".equals(next)) {
    19. UploadFTP uploadFTP = new UploadFTP();
    20. String fileName = "ahzoo.txt";
    21. String pathName = "\\ftpPath";
    22. String originFilename = "E:\\ouo\\ouo.txt";
    23. uploadFTP.uploadFile(pathName, fileName, originFilename, ftpClient);
    24. } else if ("下载".equals(next)) {
    25. DownloadFTP downloadFTP = new DownloadFTP();
    26. // String fileName = "ahzoo.md";
    27. String fileName = null;
    28. String pathName = "\\ftpPath";
    29. String downloadPath = "E:\\ahzoo";
    30. downloadFTP.downLoadFTP(pathName, fileName, downloadPath, ftpClient);
    31. } else if ("删除".equals(next)) {
    32. DeleteFTP deleteFTP = new DeleteFTP();
    33. // String fileName = "ahzoo.md";
    34. String fileName = null;
    35. String pathName = "\\test";
    36. deleteFTP.deleteFTP(pathName, fileName, ftpClient);
    37. } else if ("移动".equals(next)) {
    38. MoveFTP moveFTP = new MoveFTP();
    39. String fileName = "ahzoo.txt";
    40. String pathName = "\\ftpPath";
    41. String moveName = "move.txt";
    42. String movePath = "\\ouo";
    43. moveFTP.moveFTP(pathName, fileName, movePath, moveName, ftpClient);
    44. } else if ("读取".equals(next)) {
    45. ReadFTP readFTP = new ReadFTP();
    46. String fileName = "ahzoo.txt";
    47. String pathName = "\\ftpPath";
    48. readFTP.readFTP(pathName, fileName, ftpClient);
    49. } else if ("写入".equals(next)) {
    50. WriteFTP writeFTP = new WriteFTP();
    51. String fileName = "测试.txt";
    52. String pathName = "\\ftpPath";
    53. String contentText = "十玖八柒654321";
    54. writeFTP.writeFile(pathName, fileName, contentText, ftpClient);
    55. } else {
    56. System.out.println("输入有误");
    57. //关闭连接
    58. if (ftpClient.isConnected()) {
    59. try {
    60. ftpClient.disconnect();
    61. } catch (IOException e) {
    62. e.printStackTrace();
    63. }
    64. }
    65. }
    66. System.out.println("退出请输入exit,输入其他字符继续操作");
    67. }
    68. }
    69. }

    FTP连接类:

    1. import org.apache.commons.net.ftp.FTPClient;
    2. import org.apache.commons.net.ftp.FTPReply;
    3. import java.io.IOException;
    4. import java.net.MalformedURLException;
    5. /**
    6. * 连接FTP服务链接
    7. */
    8. public class InitFTP {
    9. //ftp服务器IP
    10. private static final String host = "192.168.6.125";
    11. //ftp服务器端口号默认为21
    12. private static final Integer port = 21;
    13. //ftp登录账号
    14. private static final String username = "ahzoo";
    15. //ftp登录密码
    16. private static final String password = "123";
    17. public void initFtpClient(FTPClient ftpClient) {
    18. ftpClient.setControlEncoding("utf-8"); //设置编码
    19. try {
    20. System.out.println("正在连接FTP服务器:" + host + ":" + port);
    21. ftpClient.connect(host, port); //连接ftp服务器
    22. ftpClient.login(username, password); //登录ftp服务器
    23. int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
    24. if(!FTPReply.isPositiveCompletion(replyCode)){
    25. System.out.println("FTP服务器连接失败:" + host + ":" + port);
    26. }
    27. System.out.println("FTP服务器连接成功:" + host + ":" + port);
    28. }catch (MalformedURLException e) {
    29. e.printStackTrace();
    30. }catch (IOException e) {
    31. e.printStackTrace();
    32. }
    33. }
    34. }

    操作相关类:

    上传文件:

    1. import org.apache.commons.net.ftp.FTPClient;
    2. import java.io.File;
    3. import java.io.FileInputStream;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. public class UploadFTP {
    7. /**
    8. * 文件上传
    9. * @param pathName 文件上传到ftp服务器的路径
    10. * @param fileName 文件上传到ftp服务器的名称
    11. * @param originPath 要上传文件所在的路径(绝对路径)
    12. **/
    13. public void uploadFile(String pathName, String fileName, String originPath, FTPClient ftpClient){
    14. InputStream inputStream = null;
    15. try{
    16. System.out.println("文件传输中");
    17. inputStream = new FileInputStream(new File(originPath));//将文本数据转换为输入流
    18. ftpClient.enterLocalPassiveMode(); //设置被动模式传输
    19. ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);//以二进制文件形式输入
    20. ftpClient.makeDirectory(pathName);//在ftp服务器创建目标路径
    21. ftpClient.changeWorkingDirectory(pathName);//切换到目标路径
    22. ftpClient.enterLocalPassiveMode();//开启端口
    23. ftpClient.storeFile(fileName, inputStream);//开始上传,inputStream表示数据源。
    24. //ftpClient.storeFile(new String(fileName.getBytes("UTF-8"),"ISO-8859-1") inputStream);
    25. System.out.println("文件上传操作完成");
    26. }catch (Exception e) {
    27. System.out.println("文件上传失败");
    28. e.printStackTrace();
    29. }finally{
    30. //关闭连接
    31. if(ftpClient.isConnected()){
    32. try{
    33. ftpClient.disconnect();
    34. }catch(IOException e){
    35. e.printStackTrace();
    36. }
    37. }
    38. if(null != inputStream){
    39. try {
    40. inputStream.close();
    41. } catch (IOException e) {
    42. e.printStackTrace();
    43. }
    44. }
    45. }
    46. }
    47. }

    下载文件:

    1. import java.io.File;
    2. import java.io.FileOutputStream;
    3. import java.io.IOException;
    4. import java.io.OutputStream;
    5. public class DownloadFTP {
    6. /**
    7. * 文件下载(暂未实现下载路径内子文件中文件功能)
    8. * @param pathName 要下载文件所在ftp路径
    9. * @param fileName 要下载文件所在ftp的文件名
    10. * @param downloadPath 文件下载后保存的路径
    11. * @param ftpClient FTPClient对象
    12. */
    13. public void downLoadFTP(String pathName, String fileName, String downloadPath, FTPClient ftpClient) {
    14. OutputStream outputStream = null;
    15. try {
    16. ftpClient.changeWorkingDirectory(pathName);// 跳转到文件目录
    17. ftpClient.enterLocalPassiveMode(); //设置被动模式传输
    18. if (fileName != null && fileName != "") {
    19. //文件名不为空,下载指定文件
    20. File filePath = new File(downloadPath);
    21. if (!filePath.exists()) {
    22. filePath.mkdir();//目录不存在,创建目录
    23. }
    24. outputStream = new FileOutputStream(new File(downloadPath + File.separator + fileName));
    25. ftpClient.retrieveFile(fileName, outputStream);
    26. System.out.println("下载操作完成");
    27. } else {
    28. FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
    29. //文件名为空,下载路径下所有文件(不包含文件夹)
    30. for (FTPFile file : files) {
    31. File filePath = new File(downloadPath);
    32. if (!filePath.exists()) {
    33. filePath.mkdir();//目录不存在,创建目录
    34. }
    35. File downloadFile = new File(downloadPath + File.separator + file.getName());
    36. outputStream = new FileOutputStream(downloadFile);
    37. ftpClient.retrieveFile(file.getName(), outputStream);
    38. System.out.println("下载操作完成:" + downloadFile);
    39. }
    40. }
    41. } catch (Exception e) {
    42. System.out.println("下载失败");
    43. e.printStackTrace();
    44. } finally {
    45. //关闭连接
    46. if(ftpClient.isConnected()){
    47. try{
    48. ftpClient.disconnect();
    49. }catch(IOException e){
    50. e.printStackTrace();
    51. }
    52. }
    53. if(null != outputStream){
    54. try {
    55. outputStream.close();
    56. } catch (IOException e) {
    57. e.printStackTrace();
    58. }
    59. }
    60. }
    61. }
    62. }

    删除:

    1. import org.apache.commons.net.ftp.FTPClient;
    2. import org.apache.commons.net.ftp.FTPFile;
    3. import java.io.File;
    4. import java.io.IOException;
    5. public class DeleteFTP {
    6. /**
    7. * 文件删除 (暂未实现删除路径内子文件夹功能)
    8. * @param pathName 要删除文件/目录所在ftp路径
    9. * @param fileName 要删除文件所在ftp的文件名
    10. * @param ftpClient FTPClient对象
    11. */
    12. public void deleteFTP(String pathName, String fileName, FTPClient ftpClient) {
    13. try {
    14. ftpClient.changeWorkingDirectory(pathName);// 跳转到文件目录
    15. ftpClient.enterLocalPassiveMode(); //设置被动模式传输
    16. if (fileName != null && fileName != "") {
    17. //文件名不为空,删除指定文件
    18. ftpClient.deleteFile(pathName + File.separator + fileName);
    19. System.out.println("删除成功");
    20. } else {
    21. //文件名为空,删除路径下所有文件
    22. System.out.println("正在删除");
    23. //删除文件
    24. FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
    25. for (FTPFile file : files) {
    26. if (file.isFile()) {
    27. //判断为文件,直接删除
    28. ftpClient.deleteFile(pathName + File.separator + file.getName());
    29. System.out.println(file + ":已完成删除操作");
    30. }
    31. if (file.isDirectory()) {
    32. /*有点问题,建议使用线程优化
    33. //判断是文件夹,递归删除子文件夹内文件
    34. deleteFTP(pathName + File.separator + file.getName(), null, ftpClient);
    35. */
    36. }
    37. }
    38. //删除文件夹
    39. ftpClient.removeDirectory(pathName);
    40. System.out.println("删除操作完成");
    41. }
    42. } catch (Exception e) {
    43. System.out.println("删除失败");
    44. e.printStackTrace();
    45. } finally {
    46. //关闭连接
    47. if(ftpClient.isConnected()){
    48. try{
    49. ftpClient.disconnect();
    50. }catch(IOException e){
    51. e.printStackTrace();
    52. }
    53. }
    54. }
    55. }
    56. }

    移动:

    1. import org.apache.commons.net.ftp.FTPClient;
    2. import org.apache.commons.net.ftp.FTPFile;
    3. import java.io.File;
    4. import java.io.IOException;
    5. public class MoveFTP {
    6. /**
    7. * 文件移动/重命名
    8. * @param pathName 要移动文件所在ftp路径
    9. * @param fileName 要移动文件所在ftp的文件名
    10. * @param movePath 文件移动后的路径
    11. * @param moveName 文件移动后的文件名(与源文件一致时实现只移动不重命名,不一致则实现了移动+重命名)
    12. * @param ftpClient FTPClient对象
    13. */
    14. public void moveFTP(String pathName, String fileName, String movePath, String moveName, FTPClient ftpClient) {
    15. try {
    16. ftpClient.enterLocalPassiveMode(); //设置被动模式传输
    17. if (!ftpClient.changeWorkingDirectory(movePath)) {
    18. //跳转到目标路径失败时创建目标目录
    19. ftpClient.makeDirectory(movePath);
    20. }
    21. if (moveName != null && moveName != "") {
    22. ftpClient.changeWorkingDirectory(pathName);// 跳转回需要进行操作的目录
    23. //移动后的文件名不为空,移动目标文件
    24. //ftpClient.rename(旧文件名, 新路径)
    25. ftpClient.rename(fileName, movePath + File.separator + moveName);
    26. System.out.println("文件移动操作已完成:" + movePath + File.separator + moveName);
    27. } else {
    28. //移动后的文件名为空,移动目标路径所有文件
    29. ftpClient.changeWorkingDirectory(pathName);// 跳转回需要进行操作的目录
    30. FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
    31. for (FTPFile file : files) {
    32. ftpClient.rename(file.getName(), movePath + File.separator + file.getName());
    33. System.out.println("移动操作完成:" + file.getName());
    34. }
    35. }
    36. } catch (Exception e) {
    37. System.out.println("移动失败");
    38. e.printStackTrace();
    39. } finally {
    40. //关闭连接
    41. if(ftpClient.isConnected()){
    42. try{
    43. ftpClient.disconnect();
    44. }catch(IOException e){
    45. e.printStackTrace();
    46. }
    47. }
    48. }
    49. }
    50. }
    51. import org.apache.commons.net.ftp.FTPClient;
    52. import org.apache.commons.net.ftp.FTPFile;
    53. import java.io.File;
    54. import java.io.IOException;
    55. public class MoveFTP {
    56. /**
    57. * 文件移动/重命名
    58. * @param pathName 要移动文件所在ftp路径
    59. * @param fileName 要移动文件所在ftp的文件名
    60. * @param movePath 文件移动后的路径
    61. * @param moveName 文件移动后的文件名(与源文件一致时实现只移动不重命名,不一致则实现了移动+重命名)
    62. * @param ftpClient FTPClient对象
    63. */
    64. public void moveFTP(String pathName, String fileName, String movePath, String moveName, FTPClient ftpClient) {
    65. try {
    66. ftpClient.enterLocalPassiveMode(); //设置被动模式传输
    67. if (!ftpClient.changeWorkingDirectory(movePath)) {
    68. //跳转到目标路径失败时创建目标目录
    69. ftpClient.makeDirectory(movePath);
    70. }
    71. if (moveName != null && moveName != "") {
    72. ftpClient.changeWorkingDirectory(pathName);// 跳转回需要进行操作的目录
    73. //移动后的文件名不为空,移动目标文件
    74. //ftpClient.rename(旧文件名, 新路径)
    75. ftpClient.rename(fileName, movePath + File.separator + moveName);
    76. System.out.println("文件移动操作已完成:" + movePath + File.separator + moveName);
    77. } else {
    78. //移动后的文件名为空,移动目标路径所有文件
    79. ftpClient.changeWorkingDirectory(pathName);// 跳转回需要进行操作的目录
    80. FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
    81. for (FTPFile file : files) {
    82. ftpClient.rename(file.getName(), movePath + File.separator + file.getName());
    83. System.out.println("移动操作完成:" + file.getName());
    84. }
    85. }
    86. } catch (Exception e) {
    87. System.out.println("移动失败");
    88. e.printStackTrace();
    89. } finally {
    90. //关闭连接
    91. if(ftpClient.isConnected()){
    92. try{
    93. ftpClient.disconnect();
    94. }catch(IOException e){
    95. e.printStackTrace();
    96. }
    97. }
    98. }
    99. }
    100. }

    读取:

    1. import org.apache.commons.net.ftp.FTPClient;
    2. import org.apache.commons.net.ftp.FTPFile;
    3. import java.io.*;
    4. public class ReadFTP {
    5. /**
    6. * 文件读取(暂未实现读取路径内子文件中文件功能)
    7. * @param pathName 要解析文件所在ftp路径
    8. * @param fileName 要下载文件所在ftp的文件名
    9. * @param ftpClient FTPClient对象
    10. */
    11. public void readFTP(String pathName, String fileName, FTPClient ftpClient) {
    12. InputStream inputStream = null;
    13. BufferedReader reader = null;
    14. try {
    15. ftpClient.changeWorkingDirectory(pathName);// 跳转到文件目录
    16. ftpClient.enterLocalPassiveMode(); //设置被动模式传输
    17. if (fileName != null && fileName != "") {
    18. //文件名不为空,读取指定文件
    19. inputStream = ftpClient.retrieveFileStream(fileName);
    20. reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
    21. String fileL;
    22. StringBuffer buffer = new StringBuffer();
    23. while(((fileL=reader.readLine()) != null)){
    24. buffer.append(fileL);
    25. }
    26. System.out.println(fileName + ":" + buffer.toString());
    27. } else {
    28. FTPFile[] files = ftpClient.listFiles();//获取目录下文件集合
    29. //文件名为空,下载路径下所有文件(不包含文件夹)
    30. for (FTPFile file : files) {
    31. inputStream = ftpClient.retrieveFileStream(fileName);
    32. reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
    33. String fileL;
    34. StringBuffer buffer = new StringBuffer();
    35. while(((fileL=reader.readLine()) != null)){
    36. buffer.append(fileL + "\n");
    37. }
    38. System.out.println(file + ":" + buffer.toString());
    39. }
    40. }
    41. } catch (Exception e) {
    42. System.out.println("读取失败");
    43. e.printStackTrace();
    44. } finally {
    45. //关闭连接
    46. if(ftpClient.isConnected()){
    47. try{
    48. ftpClient.disconnect();
    49. }catch(IOException e){
    50. e.printStackTrace();
    51. }
    52. }
    53. if(null != inputStream){
    54. try {
    55. inputStream.close();
    56. } catch (IOException e) {
    57. e.printStackTrace();
    58. }
    59. }
    60. if(null != reader) {
    61. try {
    62. reader.close();
    63. } catch (IOException e) {
    64. e.printStackTrace();
    65. }
    66. }
    67. }
    68. }
    69. }

    写入:

    写入操作与上传操作基本一致,唯一不同的就是写入操作是将文本转换为流,上传是读取文件后转换为流

    1. import org.apache.commons.net.ftp.FTPClient;
    2. import java.io.*;
    3. public class WriteFTP {
    4. /**
    5. * 文本写入
    6. * @param pathName 文本写入到ftp服务器的路径
    7. * @param fileName 文本写入到ftp服务器的名称
    8. * @param contentText 要写入的文本数据
    9. **/
    10. public void writeFile(String pathName, String fileName, String contentText, FTPClient ftpClient){
    11. InputStream inputStream = null;
    12. try{
    13. System.out.println("开始写入操作");
    14. inputStream = new ByteArrayInputStream(contentText.getBytes());//将文本数据转换为输入流,通过getBytes()方法避免中文乱码
    15. ftpClient.enterLocalPassiveMode(); //设置被动模式传输
    16. ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);//以二进制文件形式输入
    17. ftpClient.makeDirectory(pathName);//在ftp服务器创建目标路径
    18. ftpClient.changeWorkingDirectory(pathName);//切换到目标路径
    19. ftpClient.enterLocalPassiveMode();//开启端口
    20. ftpClient.storeFile(fileName, inputStream);//开始写入,inputStream表示数据源。
    21. System.out.println("文本写入操作完成");
    22. }catch (Exception e) {
    23. System.out.println("文本写入失败");
    24. e.printStackTrace();
    25. }finally{
    26. //关闭连接
    27. if(ftpClient.isConnected()){
    28. try{
    29. ftpClient.disconnect();
    30. }catch(IOException e){
    31. e.printStackTrace();
    32. }
    33. }
    34. if(null != inputStream){
    35. try {
    36. inputStream.close();
    37. } catch (IOException e) {
    38. e.printStackTrace();
    39. }
    40. }
    41. }
    42. }
    43. }