简单的实现从一台ftp服务器上获取文件到另一台ftp
之前办法是直接同时连接两台ftp服务器,边取边发
但是在写入第二个文件的时候,一直获取不到接收方ftp的输出流
OutputStream is2 = ftp.storeFileStream(ftp.printWorkingDirectory() + “/” + name);
这样就没有办法实现目的,后来想着迂回一下,既然接收方一次打开只能获取一个输出流,那么就用循环递归,让他一次打开只传输一个文件,既能保证网络文件传输不至于中途断掉,也不会因为某个输出流因为网络原因获取不到。
所用依赖比较简单只有一个Apach的commens net
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.io.OutputStream;
/**
* 列出FTP服务器上指定目录下面的所有文件
*/
public class FTP_02 {
private static Logger logger = Logger.getLogger(FTP_TE.class);
//登陆
public static FTPClient login(String url,int port,String username,String password) throws IOException {
FTPClient ftp = new FTPClient();
if (!ftp.isConnected()){
ftp.connect(url, port);
ftp.login(username, password);// 登录
ftp.enterLocalActiveMode();
// ftp.enterLocalPassiveMode();
logger.info("登录FTP主动模式"+url);
}
return ftp;
}
public static void test(FTPClient ftpClient2,String servicePath,String localPath) throws IOException {
//发送文件的ftp切换工作路径
ftpClient2.changeWorkingDirectory(servicePath);
//获取所以文件
FTPFile target[]=ftpClient2.listFiles();
//遍历发送文件的ftp的文件是否是文件夹
for (FTPFile q:target){
//接收方的ftp上创建好相应的文件夹
if (q.isDirectory()){
FTPClient ftp=login("100.100.100.100",21,"root","wjw1754.");
//切换接收方的工作目录
ftp.changeWorkingDirectory(localPath);
//在接收方的工作目录下创建目录文件
ftp.makeDirectory(q.getName());
//关闭接收方的ftp
if (ftp.isConnected()){
ftp.disconnect();
logger.debug("关闭接受文件的ftp并创建好文件夹");
}
//递归遍历
test(ftpClient2,servicePath+"/"+q.getName(),localPath+"/"+q.getName());
}else {
//如果他不是一个文件夹就写下这个文件
logger.debug("连接接受文件的ftp");
FTPClient ftpClient=login("100.100.100。100",21,"root","wjw1754.");
ftpClient.setRemoteVerificationEnabled(false);
ftpClient.setBufferSize(100000);
//切换工作路径
ftpClient.changeWorkingDirectory(localPath);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//获取接受文件的ftp的输出流,当前工作路径加文件名字
OutputStream is2 = ftpClient.storeFileStream(ftpClient.printWorkingDirectory() + "/"+q.getName());
if (is2==null){
logger.info("接受文件ftp,目标文件不存在,输出流获取不到");
}
logger.debug("is2="+is2);
//写入文件
Boolean b= ftpClient2.retrieveFile(q.getName(), is2);
if (is2!=null){
// is2.flush();
is2.close();
ftpClient.completePendingCommand();
}
logger.debug("文件成功"+b+"文件名"+q.getName());
//关闭中科软的ftp
if (ftpClient.isConnected()){
ftpClient.disconnect();
logger.info("退出接受文件的FTP");
}
}
}
}
public static void main(String[] args) throws IOException {
//登陆发送文件的服务器,服务器地址,端口号,用户名,密码
FTPClient ftpClient2=login("100.100.100.100",21,"root","123");
ftpClient2.setRemoteVerificationEnabled(false);
//发送文件的服务器路径
String servicePath="/root/target/000000000408";
//接受文件的服务器路径
String localPath="/logs/wjw";
//调用发送文件的方法
test(ftpClient2,servicePath,localPath);
//关闭发送文件的服务器ftp
if (ftpClient2.isConnected()){
ftpClient2.disconnect();
logger.info("退出发送文件的FTP");
}
}
}
有不足的地方欢迎讨论!!!