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);
        }
    }
}
相关推荐
ybq1951334543113 分钟前
Redis-主从复制-分布式系统
java·数据库·redis
weixin_472339461 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
小毛驴8501 小时前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
枯萎穿心攻击1 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
DKPT2 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
Eiceblue3 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
好奇的菜鸟3 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
m0_555762903 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
DuelCode4 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
浪裡遊4 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php