1. 首先在本地搭建一个ftp服务站点

JAVA中FTP结束后文件被占用 ftputils java_文件存储

2.搭建springboot后导入ftp相关的依赖
`

<dependency>
        <groupId>com.github.shalousun</groupId>
        <artifactId>common-util</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-util</groupId>
        <artifactId>commons-util</artifactId>
        <version>final</version>
    </dependency>
    <dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.6</version>
    </dependency>

`

3.创建util包,并创建FtpUtils工具类,其中需要用到一个创建UUID工具类

  • 创建UUID工具类
    `

import java.util.UUID;

public class UUIDUtils {
public static String RandomUUID(){

return UUID.randomUUID().toString()
            .replace("-","");

}

}

  • 创建FTPUtil工具类
    `

import java.io.*;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public class FtpUtils {

/**
 * 上传文件至FTP服务器
 *
 * @param url       服务器IP地址
 * @param port      服务器端口
 * @param userName  用户登录名
 * @param password  用户登录密码
 * @param storePath 服务器文件存储路径
 * @param fileName  服务器文件存储名称
 * @param is        文件输入流
 * @return <b>true</b>:上传成功
 * <br/>
 * <b>false</b>:上传失败
 */
public static boolean storeFile(String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {
    boolean result = false;
    FTPClient ftp = new FTPClient();
    try {
        // 连接至服务器,端口默认为21时,可直接通过URL连接
        ftp.connect(url, port);
        // 登录服务器
        ftp.login(userName, password);
        // 判断返回码是否合法
        if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
            // 不合法时断开连接
            ftp.disconnect();
            // 结束程序
            return result;
        }
        // 判断ftp目录是否存在,如果不存在则创建目录,包括创建多级目录
        String s = "/" + storePath;
        String[] dirs = s.split("/");
        ftp.changeWorkingDirectory("/");
        //按顺序检查目录是否存在,不存在则创建目录
        for (int i = 1; dirs != null && i < dirs.length; i++) {
            if (!ftp.changeWorkingDirectory(dirs[i])) {
                if (ftp.makeDirectory(dirs[i])) {
                    if (!ftp.changeWorkingDirectory(dirs[i])) {
                        return false;
                    }
                } else {
                    return false;
                }
            }
        }
        // 设置文件操作目录
        ftp.changeWorkingDirectory(storePath);
        // 设置文件类型,二进制
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        // 设置缓冲区大小
        ftp.setBufferSize(3072);
        // 上传文件
        result = ftp.storeFile(fileName, is);
        // 关闭输入流
        is.close();
        // 登出服务器
        ftp.logout();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            // 判断输入流是否存在
            if (null != is) {
                // 关闭输入流
                is.close();
            }
            // 判断连接是否存在
            if (ftp.isConnected()) {
                // 断开连接
                ftp.disconnect();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return result;
}


/**
 * 从FTP服务器下载文件至本地
 *
 * @param url        服务器IP地址
 * @param port       服务器端口
 * @param userName   用户登录名
 * @param password   用户登录密码
 * @param remotePath 服务器文件存储路径
 * @param fileName   服务器文件存储名称
 * @param localPath  本地文件存储路径
 * @return <b>true</b>:下载成功
 * <br/>
 * <b>false</b>:下载失败
 */
public static boolean retrieveFile(String url, int port, String userName, String password,
                                   String remotePath, String fileName, String localPath) {
    boolean result = false;
    FTPClient ftp = new FTPClient();
    OutputStream os = null;
    try {
        // 连接至服务器,端口默认为21时,可直接通过URL连接
        ftp.connect(url, port);
        // 登录服务器
        ftp.login(userName, password);
        // 判断返回码是否合法
        if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
            System.out.println(ftp.getReplyCode());
            System.out.println(FTPReply.isPositiveCompletion(ftp.getReplyCode()));
            System.out.println("不合法!");
            // 不合法时断开连接
            ftp.disconnect();
            // 结束程序
            return result;
        }
        // 设置文件操作目录
        ftp.changeWorkingDirectory(remotePath);
        // 设置文件类型,二进制
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        // 设置缓冲区大小
        ftp.setBufferSize(3072);
        // 设置字符编码
        ftp.setControlEncoding("UTF-8");
        // 构造本地文件对象
        File localFile = new File(localPath + "/" + fileName);
        // 获取文件操作目录下所有文件名称
        String[] remoteNames = ftp.listNames();
        // 循环比对文件名称,判断是否含有当前要下载的文件名
        for (String remoteName : remoteNames) {
            System.out.println(remoteNames);
            if (fileName.equals(remoteName)) {
                result = true;
            }
        }
        // 文件名称比对成功时,进入下载流程
        if (result) {
            // 构造文件输出流
            os = new FileOutputStream(localFile);
            // 下载文件
            result = ftp.retrieveFile(fileName, os);
            // 关闭输出流
            os.close();
        }
        // 登出服务器
        ftp.logout();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            // 判断输出流是否存在
            if (null != os) {
                // 关闭输出流
                os.close();
            }
            // 判断连接是否存在
            if (ftp.isConnected()) {
                // 断开连接
                ftp.disconnect();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return result;
}

/**
 * 从FTP服务器删除文件
 *
 * @param url        服务器IP地址
 * @param port       服务器端口
 * @param userName   用户登录名
 * @param password   用户登录密码
 * @param remotePath 服务器文件存储路径
 * @param fileName   服务器文件存储名称
 * @return <b>true</b>:删除成功
 * <br/>
 * <b>false</b>:删除失败
 */
public static boolean deleteFile(String url, int port, String userName,
                                 String password, String remotePath, String fileName) {
    boolean result = false;
    FTPClient ftp = new FTPClient();
    try {
        // 连接至服务器,端口默认为21时,可直接通过URL连接
        ftp.connect(url, port);
        // 登录服务器
        ftp.login(userName, password);
        // 判断返回码是否合法
        if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
            // 不合法时断开连接
            ftp.disconnect();
            // 结束程序
            return result;
        }
        // 设置文件操作目录
        ftp.changeWorkingDirectory(remotePath);
        // 设置文件类型,二进制
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        // 设置缓冲区大小
        ftp.setBufferSize(3072);
        // 设置字符编码
        ftp.setControlEncoding("UTF-8");
        // 获取文件操作目录下所有文件名称
        String[] remoteNames = ftp.listNames();
        // 循环比对文件名称,判断是否含有当前要下载的文件名
        for (String remoteName : remoteNames) {
            if (fileName.equals(remoteName)) {
                result = true;
            }
        }
        // 文件名称比对成功时,进入删除流程
        if (result) {
            // 删除文件
            result = ftp.deleteFile(fileName);
        }
        // 登出服务器
        ftp.logout();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            // 判断连接是否存在
            if (ftp.isConnected()) {
                // 断开连接
                ftp.disconnect();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return result;
}

public static void main(String[] args) throws FileNotFoundException {
    try {
        FileInputStream fis = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\太行后台socket发送工具1.txt"));
        System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", UUIDUtils.RandomUUID() + ".txt", fis));
//            File file = new File("D:\upload\20191217070411_start.txt");

//            InputStream is = new FileInputStream(file);

//            System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\FTP\test", "2.txt", is));

//            System.out.println(retrieveFile("10.8.66.22", 21, "admin", "1", "D:\FTP\test", "2.txt", "D:\upload"));

//            System.out.println(deleteFile("10.8.66.22", 21, "admin", "1", "D:\FTP\test", "2.txt"));

} catch (FileNotFoundException e) {

e.printStackTrace();

}
}

}
`
4.测试FtpUtile工具类

`

@SpringBootTest
class FtptestApplicationTests {

/**
 * * @param url        服务器IP地址
 * * @param port       服务器端口
 * * @param userName   用户登录名
 * * @param password   用户登录密码
 * * @param remotePath 服务器文件存储路径
 * * @param fileName   服务器文件存储名称
 * * @param localPath  本地文件存储路径
 * * @return <b>true</b>:下载成功
 * * <br/>
 * * <b>false</b>:下载失败
 */
@Test
public void ftpTest(){

    String url="**.**.**.**";  
    int port=213;
    String username="test";
    String password="123456";
    String storepath="D:\\ftp";
    String fileName="ftp.zip";

// InputStream is=??

// FTPUtils.storeFile(url,port,username,password,storepath,fileName);

System.out.println(FtpUtils.retrieveFile(url, port, username, password,
            storepath, fileName, "D:\\A_临时数据\\ftplocal"));


}

}

`