1、引入Maven依赖
<!-- ftp依赖包 --> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency>
2、实现代码如下
package com.chenly.ftp.bokeyuan; import org.apache.commons.net.ftp.FTPClient; import java.io.*; import java.nio.charset.StandardCharsets; /** * @author: void * @date: 2021-09-16 11:47 * @description: * @version: 1.0 */ public class FtpUtil { private String host = "192.169.2.14"; private int port = 21; private String username = "root"; private String password = "123456"; private String basePath = "/root/"; public static void main(String[] args) { FtpUtil ftpUtil = new FtpUtil(); //上传文件 ftpUtil.uploadFile(); //下载文件 ftpUtil.downLoadFile(); //写文件 ftpUtil.writeFile(); //读文件 ftpUtil.readFile(); //删除文件 ftpUtil.deleteFile(); } /** * 建立连接,登录 * @return */ public FTPClient connectAndLogin(){ FTPClient ftpClient = new FTPClient(); try { //连接服务器 ftpClient.connect(host,port); //登录 boolean flag = ftpClient.login(username,password); if(flag){ System.out.println("建立连接,登录成功"); return ftpClient; }else{ System.out.println("登录ftp失败"); return null; } } catch (Exception e) { e.printStackTrace(); return null; } } /** * 退出登录,断开连接 * @param ftpClient */ public void logoutAndDisconnect(FTPClient ftpClient){ if(ftpClient!=null && ftpClient.isConnected()){ try { //退出登录 ftpClient.logout(); //断开连接 ftpClient.disconnect(); System.out.println("退出登录,断开连接"); } catch (IOException e) { e.printStackTrace(); } } } /*** * 上传文件 */ public void uploadFile(){ FtpUtil ftpUtil = new FtpUtil(); FTPClient ftpClient = ftpUtil.connectAndLogin(); if(ftpClient == null){ return; } //本地文件 File file = new File("E:\javaproject\ideaProject\demo\file-demo\测试.txt"); //文件上传的ftp服务器目录 String ftpPath = "/ftp/测试目录/"; //将目录名称转为iso-8859-1编码 (FTP协议里面,规定文件名编码为iso-8859-1) String validPath = new String(ftpPath.getBytes(), StandardCharsets.ISO_8859_1); //文件上传到ftp的文件名 String fileName = "测试.txt"; // FTP协议里面,规定文件名编码为iso-8859-1 String ftpFileName = new String(fileName.getBytes(),StandardCharsets.ISO_8859_1); //文件输入流 FileIntPutStream FileInputStream fis = null; try { fis = new FileInputStream(file); //设置缓冲区大小 4M ftpClient.setBufferSize(4*1024*1024); //设置编码 ftpClient.setControlEncoding("utf-8"); boolean changeWorkDirFlag = ftpClient.changeWorkingDirectory(basePath+validPath); if(!changeWorkDirFlag){ //创建子目录 createDirectory(ftpClient,validPath); } //存储文件至ftp服务器 boolean flag = ftpClient.storeFile(ftpFileName,fis); System.out.println("上传文件"+(flag?"成功":"失败")); } catch (Exception e) { e.printStackTrace(); }finally { ftpUtil.logoutAndDisconnect(ftpClient); } } /** * * 在根目录下创建目录,我自己搭建的vsftp服务器根目录是/root,因此是在/root下创建目录 * @param ftpClient ftp客户端 * @param directory 文件目录,将在根目录下创建 */ public static void createDirectory(FTPClient ftpClient,String directory) { String fileSeparator = "/"; if (!directory.endsWith(fileSeparator)) { directory += fileSeparator; } int fromIndex = 0; int endIndex = 0; try { if(ftpClient.changeWorkingDirectory(directory)){ //如果目录存在,直接返回 return; } if (directory.startsWith(fileSeparator)) { fromIndex = 1; } endIndex = directory.indexOf(fileSeparator, fromIndex); while (true) { String subDirectory = new String(directory.substring(fromIndex, endIndex)); if (!ftpClient.changeWorkingDirectory(subDirectory)) { if (ftpClient.makeDirectory(subDirectory)) { ftpClient.changeWorkingDirectory(subDirectory); } else { System.out.println("创建"+subDirectory+"目录失败"); return; } } fromIndex = endIndex + 1; endIndex = directory.indexOf(fileSeparator, fromIndex); //检查所有目录是否创建完毕 if (endIndex <= fromIndex) { break; } } System.out.println("上传目录创建成功"); } catch (Exception e) { System.out.println("上传目录创建失败"); e.printStackTrace(); } } /** * 下载文件 */ public void downLoadFile(){ FtpUtil ftpUtil = new FtpUtil(); FTPClient ftpClient = ftpUtil.connectAndLogin(); if(ftpClient == null){ return; } //ftp服务器文件名 String ftpFilePath = basePath+"ftp/测试目录/测试.txt"; String validFtpFilePath = new String(ftpFilePath.getBytes(),StandardCharsets.ISO_8859_1); //下载到本地地址 String localPath = "E:\javaproject\ideaProject\demo\file-demo\从ftp下载.txt"; try { OutputStream os = new FileOutputStream(localPath); //1、检查文件是否存在 if(!isFileExist(ftpFilePath,ftpClient)){ System.out.println("文件不存在"); return; } boolean flag = ftpClient.retrieveFile(validFtpFilePath,os); System.out.println("下载文件"+(flag?"成功":"失败")); } catch (Exception e) { e.printStackTrace(); }finally { ftpUtil.logoutAndDisconnect(ftpClient); } } /** * 判断文件是否存在 * @param ftpFile * @param ftpClient * @return */ public Boolean isFileExist(String ftpFile, FTPClient ftpClient) { if (ftpClient != null) { try { String validFtpFile = new String(ftpFile.getBytes(),StandardCharsets.ISO_8859_1); String path = validFtpFile.substring(0,validFtpFile.lastIndexOf("/")); String fileName = validFtpFile.substring(validFtpFile.lastIndexOf("/")+1); // 判断是否存在该目录 boolean changeWorkDirFlag = ftpClient.changeWorkingDirectory(path); if (!changeWorkDirFlag) { System.out.println("目录不存在"); return false; } ftpClient.enterLocalPassiveMode(); // 设置被动模式,开通一个端口来传输数据 String[] fs = ftpClient.listNames(); // 判断该目录下是否有文件 if (fs == null || fs.length == 0) { System.out.println("该目录下没有文件"); return false; } for (String ftpName : fs) { if (ftpName.equals(fileName)) { return true; } } } catch (IOException e) { e.printStackTrace(); } } return false; } /** * 删除文件 */ public void deleteFile(){ FtpUtil ftpUtil = new FtpUtil(); FTPClient ftpClient = ftpUtil.connectAndLogin(); if(ftpClient == null){ return; } String fileName = "/root/ftp/测试目录/测试.txt"; String validFileName = new String(fileName.getBytes(), StandardCharsets.ISO_8859_1); boolean flag ; try { flag = ftpClient.deleteFile(validFileName); System.out.println("文件删除结果:"+flag); } catch (IOException e) { e.printStackTrace(); }finally { ftpUtil.logoutAndDisconnect(ftpClient); } } /** * 写文件 */ public void writeFile(){ FtpUtil ftpUtil = new FtpUtil(); FTPClient ftpClient = ftpUtil.connectAndLogin(); if(ftpClient == null){ return; } String content = "写入ftp服务器上文件内容"; String fileName = basePath+"/ftp/存储到ftp文件名.txt"; String validFileName = new String(fileName.getBytes(),StandardCharsets.ISO_8859_1); //将content转为输入流 ByteArrayInputStream is = new ByteArrayInputStream(content.getBytes()); try { boolean flag = ftpClient.storeFile(validFileName,is); System.out.println("写文件至ftp"+(flag?"成功":"失败")); } catch (IOException e) { e.printStackTrace(); }finally { ftpUtil.logoutAndDisconnect(ftpClient); } } /** * 读文件 */ public void readFile(){ FtpUtil ftpUtil = new FtpUtil(); FTPClient ftpClient = ftpUtil.connectAndLogin(); if(ftpClient == null){ return; } String fileName = basePath+"ftp/测试目录/测试.txt"; String validFileName = new String(fileName.getBytes(),StandardCharsets.ISO_8859_1); try { if(!isFileExist(fileName,ftpClient)){ System.out.println("文件不存在"); return; } InputStream inputStream = ftpClient.retrieveFileStream(validFileName); //将输入流转为字符串 InputStreamReader reader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(reader); String line; System.out.println("读取文件内容为:"); while ((line = bufferedReader.readLine()) !=null){ //文件内容 System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }finally { ftpUtil.logoutAndDisconnect(ftpClient); } } }
相关内容: