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);
        }
    }
}
相关推荐
培风图南以星河揽胜4 分钟前
Java实习模拟面试|离散数学|概率论|金融英语|数据库实战|职业规划|期末冲刺|今日本科计科要闻速递:技术分享与学习指南
java·面试·概率论
能鈺CMS5 分钟前
能鈺CMS · 虚拟发货源码
java·大数据·数据库
二川bro7 分钟前
数据可视化进阶:Python动态图表制作实战
开发语言·python·信息可视化
sheji34168 分钟前
【开题答辩全过程】以 环保监督管理系统为例,包含答辩的问题和答案
java·eclipse
不会玩电脑的Xin.11 分钟前
Web请求乱码解决方案
java·javaweb
Billow_lamb19 分钟前
Spring Boot2.x.x 全局错误处理
java·spring boot·后端
编程火箭车23 分钟前
【Java SE 基础学习打卡】14 Java 注释
java·编程规范·代码注释·api文档·代码可读性·javadoc·文档注释
雁于飞31 分钟前
分布式基础
java·spring boot·分布式·spring·wpf·cloud native
q***2511 小时前
java进阶1——JVM
java·开发语言·jvm
while(1){yan}1 小时前
线程的状态
java·开发语言·jvm