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