实现一个ftp服务器传文件到另一个ftp服务器,解决获取不到OutputStream输出流

简单的实现从一台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");
        }
    }
}

有不足的地方欢迎讨论!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值