java实现连接Ftp上传下载文件

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);
        }


    }


}

相关内容:

LINUX搭建VSFTP服务器

作者:小念
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/kiko2014551511/p/15304524.html