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);
        }
    }
}
相关推荐
CodeWithMe1 分钟前
【C/C++】namespace + macro混用场景
c语言·开发语言·c++
蓝婷儿9 分钟前
6个月Python学习计划 Day 17 - 继承、多态与魔术方法
开发语言·python·学习
Mikhail_G33 分钟前
Python应用变量与数据类型
大数据·运维·开发语言·python·数据分析
BillKu35 分钟前
Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
java·tomcat·mybatis
全栈凯哥36 分钟前
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
java·算法·leetcode·链表
chxii37 分钟前
12.7Swing控件6 JList
java
全栈凯哥38 分钟前
Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
java·算法·leetcode·链表
YuTaoShao39 分钟前
Java八股文——集合「List篇」
java·开发语言·list
PypYCCcccCc44 分钟前
支付系统架构图
java·网络·金融·系统架构
华科云商xiao徐1 小时前
Java HttpClient实现简单网络爬虫
java·爬虫