Java I/O FTP同步代码及FileZilla Server设置

2019-12-26 15:40:35 浏览数 (1)

假设现在有两台机器,一个是你本地开发的机器,一台是服务器,而你本地又有两个应用,需要从shopManage同步到fxShop,如下图.

在2的时间节点还要同时同步到右边的服务器上,二本地两个应用之间使用IO拷贝。

新建一个工具类如下: 第一个方法用IO流方式进行本地拷贝 第二个方法才是FTP方式

代码语言:javascript复制
public class FileSynchronousUtil {
    /**
     * 文件本机拷贝
     * @param localPath 源路径
     * @param yinPath 目标路径
     * @return
     */
    public static boolean copy(String localPath, String yinPath) {
        try {
            int bytesum = 0; 
            int byteread = 0;
            File oldfile = new File(localPath); 
            if (oldfile.exists()) { // 文件存在时 
                InputStream inStream = new FileInputStream(localPath); 
                String wenjianName = localPath.substring(localPath.lastIndexOf("\"));
                System.out.println(wenjianName); 
                System.out.println(yinPath   wenjianName);
                // 读入原文件
                FileOutputStream fs = new FileOutputStream(yinPath   wenjianName);
                byte[] buffer = new byte[1444];
                while ((byteread = inStream.read(buffer)) != -1) {
                    bytesum  = byteread; // 字节数 文件大小
                    System.out.println(bytesum);
                    fs.write(buffer, 0, byteread);
                }
                inStream.close();
           }
        } catch (Exception e) {
            System.out.println("复制单个文件操作出错");
            e.printStackTrace();
        }
        return true;
    }
 
    /**
     * 使用FTP方式同步文件到远程服务器
     * @param localPath 本地路径
     * @param FtpPath 远程FTP服务器路径
     * @param FtpPathName 远程FTP服务器登录名
     * @param FtpPathPass 远程FTP服务器登录密码
     * @param FtpIp 远程FTP服务器IP地址
     */
    public static void copy(String localPath, String FtpPath, String FtpPathName,
        String FtpPathPass, String FtpIp) {
        //链接FTP
        FTPClient ftpClient = new FTPClient();
        FileInputStream fis = null;
        int reply;
        try {
            ftpClient.connect(FtpIp, 21);
            ftpClient.login(FtpPathName, FtpPathPass);
            reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
            }
            fis = new FileInputStream(localPath);
            ftpClient.setBufferSize(10240000);
            String wenjianName = localPath.substring(localPath.lastIndexOf("\") 1); 
            ftpClient.makeDirectory(FtpPath);
            ftpClient.changeWorkingDirectory(FtpPath);
            ftpClient.setControlEncoding("GBK");
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            //被动模式传输
            ftpClient.enterLocalPassiveMode();
//          ftpClient.storeFile(new String(wenjianName.getBytes("GBK"), "iso-8859-1") , fis);
            ftpClient.storeFile(wenjianName, fis);
            fis.close();
        /*  String finalRemoteFileName = FtpPath.replaceAll(".ing", "");
            ftpClient.rename(FtpPath, finalRemoteFileName);*/
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException ioe) {
                    ioe.getMessage();
                }
            }
        }
    }
}

同时准备一个ftp.propertis文件,主要参数都在这里配置,需要读取这个文件:

代码语言:javascript复制
#本地IP
localIp=127.0.0.1
##本地目标地址
local_targetPath=D:\tomcat\apache-tomcat-6.0.16\webapps\fxShop
##远程目标地址
remote_targetPath=
#远程FTP服务器IP
remote_ftpIp=127.0.0.1
#远程FTP服务器登录名
remote_ftpServerName=test
#远程FTP服务器登录密码
remote_ftpServerPassWord=123

写一个主调(Main)方法,就可以进行调用测试了:

代码语言:javascript复制
public static void main(String[] args) {
        //读取配置文件,
        InputStream stream = null;
        try {
            //stream = new BufferedInputStream(new FileInputStream(new File("src/common.properties")));
            stream = NowFirst.class.getResourceAsStream("/common.properties");
            System.err.println(stream);
        } catch (Exception e) {
            System.out.println("配置文件未找到!");
        }
         Properties p = new Properties();
         try {
            p.load(stream);
        } catch (IOException e) {
            System.out.println("文件未加载");
        }
        String localPath=p.getProperty("localPath");
        String targetPath=p.getProperty("targetPath");
        String FtpOnePath=p.getProperty("FtpOnePath");
        System.err.println(FtpOnePath);
        String FtpOnePathName=p.getProperty("FtpOnePathName");
        String FtpOnePathPass=p.getProperty("FtpOnePathPass");
        String FtpTwoPath=p.getProperty("FtpTwoPath");
        String FtpTwoPathName=p.getProperty("FtpTwoPathName");
        String FtpTwoPathPass=p.getProperty("FtpTwoPathPass");
        String FtpOneIp=p.getProperty("FtpOneIp");
        String FtpTwoIp=p.getProperty("FtpTwoIp");
        serviceDao dao=new serviceDao();
        //同步本地
        //dao.copy(localPath, targetPath);
        //同步Ftp
        //第一台
        dao.copy(localPath, FtpOnePath, FtpOnePathName, FtpOnePathPass,FtpOneIp);
        //第二台
        //dao.copy(localPath, FtpTwoPath, FtpTwoPathName, FtpTwoPathPass,FtpTwoIp);
}

当然了,是用FTP同步需要FTP服务器支持,你要建立一个FTP服务,比较方便的是使用FileZilla Server

FileZilla Server设置: 首先需要新建一个用户:

直接填一个用户名就好了:

然后账号设置这里,你可以给给他分配一个密码,也可以不写,去掉勾就好了:

接下来就是制定一个共享目录,这个目录就是用来同步到的目标地址:

这里假设建在F盘的FTPTest目录下。 注意:这里的Read、Write必须勾选,否则FTP就没法写入文件了

还要设置这个文件夹为系统共享的,右键-属性-共享这个文件夹:

好了,就弄完了。

ftp

0 人点赞