Java 两台服务器间使用FTP进行文件传输

背景:需要把服务器A中的文件拷贝至服务器B中,要求使用FTP进行传输,当文件传输未完成时文件是tmp格式的,传输完毕后显示为原格式(此处是grib2)。

java 复制代码
package org.example;

import org.apache.commons.io.FileUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.example.FtpBean.FtpBean;
import org.example.FtpUtil.FtpUtil;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class FtpSimple {
    public static void main(String[] args) throws IOException {
        // 连接服务器
        FTPClient ftpClient = null;
        FTPClient ftpClient2 = null;
        String rootDir = "/文件目录/";
        try {
            ftpClient = new FTPClient();
            ftpClient.connect("IP地址");
            ftpClient.enterLocalActiveMode();
            ftpClient.login("用户名","密码");
            System.out.println("A建立连接!");
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 设置二进制传输
            ftpClient.changeWorkingDirectory(rootDir);// 进入目标文件所在目录

            ftpClient2 = new FTPClient();
            ftpClient2.connect("IP地址");
            ftpClient2.enterLocalActiveMode();
            ftpClient2.login("用户名","密码");
            System.out.println("B建立连接!");
            ftpClient2.setFileType(FTPClient.BINARY_FILE_TYPE); // 设置二进制传输
            ftpClient2.changeWorkingDirectory("/文件目录/");

            System.out.println("切换至目录成功!开始遍历...");
            FTPFile[] files = ftpClient.listFiles();
            System.out.println("文件数目(包括2个系统文件):"+files.length);

            Integer flag_temp = 0;

            // 遍历文件,获得文件流
            for(FTPFile file: files) {
                String fileName = file.getName();
                if(fileName.endsWith("grib2")) // 确定格式,以免读取到系统文件
                {
                    InputStream inputStream = ftpClient.retrieveFileStream(rootDir+fileName);

                    try{
                        ftpClient2.storeFile(fileName+".tmp",inputStream);
                        flag_temp += 1; // 传输成功的文件数量
                    }catch(Exception e) {
                        System.out.println(e);
                    }
                    inputStream.close();
                    ftpClient2.rename(fileName+".tmp", fileName);
                    ftpClient.completePendingCommand(); // 必须加,不然只有第一个文件可以传输成功。

                    if(flag_temp == files.length - 2)
                    {
                        System.out.println("传输完毕!");
                    }
                }
            }
            // 关闭ftp连接
            ftpClient.disconnect();
            ftpClient2.disconnect();
        }catch (Exception e){
            StringBuffer sb = new StringBuffer("异常:"+e.toString());
            System.out.println(sb);
        }
    }
}
相关推荐
纪念 2292 分钟前
c++ string(二)
开发语言·c++
李福春6 分钟前
斗破Google ADK Java苍穹-第5境斗灵-凝物通脉-Context与State
java·开发语言·人工智能·java-ee·google adk·深圳同盟·腾讯云架构师技术同盟
十年Java程序媛7 分钟前
Java 接口和抽象类对比|抛弃老旧八股,正确选型
java·开发语言·spring boot·后端
见叶之秋9 分钟前
【C++】从基类到派生类:关于C++继承的务实梳理
开发语言·c++
范中勤10 分钟前
OSS 多文件打包回流上传:流式管道无落地 VS 临时磁盘落地,两种工业方案深度对比
java·高并发·zip·oss·架构选型
无毁的湖光-Al12 分钟前
解Bug之路-隔离故障点后业务不恢复?-热点Key处理与亚稳态故障
java·数据库·mysql
kyle~17 分钟前
C++ 智能指针:RAII、所有权与对象生命周期
开发语言·c++
Eyfcom18 分钟前
快递管理系统中的电子围栏实战:高德与谷歌双平台技术选型与实现
java·后端·快递管理系统
Rain的Java大神之路18 分钟前
Java PDF导出,90%的人选错库!11个生产坑+选型+代码,一次讲透
java·后端·面试
y1su21 分钟前
Leetcode 单调栈模板
java·开发语言·数据结构·算法·leetcode