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);
        }
    }
}
相关推荐
jinyishu_1 小时前
C++ 继承全解:从基础到高级特性
开发语言·c++
接着奏乐接着舞2 小时前
大模型开发 agent 知识库
java
xuhaoyu_cpp_java2 小时前
SpringBoot学习(四)
java·经验分享·spring boot·笔记·学习
plainGeekDev2 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台3 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
小喻同学i3 小时前
std::thread函数参数传递
开发语言·c++
程序员天天困3 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·后端
要开心吖ZSH3 小时前
AI医疗分诊与健康咨询助手agent开发——(4-2)从零到一:我给AI医疗分诊助手加了个“知识库大脑“,终于搞懂了RAG是什么
java·docker·agent·医疗·rag
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第179题】【07_Redis篇】第15题:什么是 Redlock 算法?
java·redis·分布式锁·高可用·redlock
Ulyanov4 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头