从SFTP到代码移植Liunx 环境

(本文纯属是在工作中笔记,只是实现了基本的操作,在遍历数据去重复的那块代码写的不怎么好,数据量大了很耗时(需要大家自己实现),建议使用c3p0-0.9.5.2.bin第三方库进行管理数据库与服务器的频繁连接,有不妥的地方请大家多多包涵........

SFTP概念:

                    是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。

SFTP需要的jar包:

    从SFTP到代码移植Liunx 环境_第1张图片

    由于jar包无法上传把需要所需要的jar包名称在这里标注好了点击这里进行下载对应的jar包,

不会下载的小伙伴附上教程。

SFTP上文件代码:

    

package text;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import com.jcraft.jsch.ChannelSftp;
/**
*
* @author 文件上传
*
*/
public class SFTPTest {
    public SFTPChannel getSFTPChannel() {
        return new SFTPChannel();
    }
    public static void main(String[] args) throws Exception {
        SFTPTest test = new SFTPTest();
        Map sftpDetails = new HashMap();
        // 设置主机ip,端口,用户名,密码
        sftpDetails.put(SFTPConstants.SFTP_REQ_HOST, "你远程服务器ip地址");
        sftpDetails.put(SFTPConstants.SFTP_REQ_USERNAME, "远程服务器用户名");
        sftpDetails.put(SFTPConstants.SFTP_REQ_PASSWORD, "远程服务器密码");
        sftpDetails.put(SFTPConstants.SFTP_REQ_PORT, "端口号");
        
        String src =""; // 本地文件名
        String dst =""; // 目标文件名
        //初始化配置      
        SFTPChannel channel = test.getSFTPChannel();
        ChannelSftp chSftp = channel.getChannel(sftpDetails, 响应时间);
        File file = new File(src);
        long fileSize = file.length();
        OutputStream out = chSftp.put(dst, new FileProgressMonitor(fileSize), ChannelSftp.OVERWRITE); // 使用OVERWRITE模式 数据传输的模式
        byte[] buff = new byte[1024 * 256]; // 设定每次传输的数据块大小为256KB
        int read;
        if (out != null) {
            System.out.println("Start to read input stream");
            InputStream is = new FileInputStream(src);
            do {
                read = is.read(buff, 0, buff.length);
                if (read > 0) {
                    out.write(buff, 0, read);
                }
                out.flush();
            } while (read >= 0);
            System.out.println("input stream read done.");
        }
        //chSftp.put(src, dst, new FileProgressMonitor(fileSize), ChannelSftp.OVERWRITE); // 代码段2
        // chSftp.put(new FileInputStream(src), dst, new FileProgressMonitor(fileSize), ChannelSftp.OVERWRITE); // 代码段3
        chSftp.quit();
        channel.closeChannel();
    }
}

SFTP下载文件:

package download;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
/**
*
* @author 优化后的代码 配合.properties(配置文件)使用 使用配置文件的目的:使代码更加灵活
*
*/
public class SFTPDownload {
    private static String SERVER_IP,SERVER_USER_NAME,SERVER_USER_PASSWORD,SERVER_SFTPPATH,SERVER_LOCALPATH,SERVER_Url,LOCAl_URL,MYSQL_URL,MYSQL_USERNAME,MYSQL_USERPASSWORD;
    private static final int TIMOUT=10000;
    private static List list;
    private Session sshSession = null;
    private static Channel channel = null;
    private static ChannelSftp sftp = null;
    private String host;// 服务器连接ip
    private String username;// 用户名
    private String password;// 密码
    private int timout;//请求时间
    private int port = 8822;
    @SuppressWarnings("static-access")
    public static void main(String[] args) {
        config();
        // 连接服务器
        /*SFTPDownload sftp = null;
        if (sftp == null) {
            sftp = new SFTPDownload(SERVER_IP, SERVER_USER_NAME, SERVER_USER_PASSWORD,TIMOUT);
            sftp.connect();
            //遍历服务器指定文件内容
            System.out.println("-----------遍历服务器数据---------");
            sftp.batchDownLoadFile(SERVER_SFTPPATH, SERVER_LOCALPATH, "ASSESS", ".txt");
        }*/
    }
    public static void config(){
        // 创建属性文件对象
        Properties p = new Properties();
        //配置文件存在本地的路径
        String path = "";
        InputStream in = null;
        try {
            in = new BufferedInputStream(new FileInputStream(path));
            p.load(in);
            //远程服务器IP地址
            SERVER_IP=p.getProperty("IP");
            //名称
            SERVER_USER_NAME=p.getProperty("USER_NAME");
            //密码
            SERVER_USER_PASSWORD=p.getProperty("USER_PASSWORD");
            //远程服务器地址
            SERVER_SFTPPATH=p.getProperty("sftpPath");
            //保存到本地的地址
            SERVER_LOCALPATH=p.getProperty("localPath");
            //查找出远程服务器里面最新文件的地址
            SERVER_Url=p.getProperty("serverUrl");
            //保存到本地地址的路径
            LOCAl_URL=p.getProperty("localUrl");
            //mysql数据库的地址
            MYSQL_URL=p.getProperty("mysql_url");
            //mysql数据库的用户名
            MYSQL_USERNAME=p.getProperty("mysql_username");
            //mysql数据库的密码
            MYSQL_USERPASSWORD=p.getProperty("mysql_userpassword");
            System.out.println("数据库地址:"+MYSQL_URL);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 遍历服务器指定文件夹下最新的文件
     */
    @SuppressWarnings("unused")
    public static String batchDownLoadFile(String remotePath, String localPath,String fileFormat, String fileEndFormat) {
        String pathend = null;
        try {
            // 变量服务器指定文件夹内容
            Vector v = listFiles(remotePath);
            if (v.size() > 0) {
                System.out.println("本次处理文件个数不为零,开始下载...fileSize=" + v.size());
                Iterator it = v.iterator();
                while (it.hasNext()) {
                    LsEntry entry = (LsEntry) it.next();
                    String filename = entry.getFilename();
                    //SftpATTRS attrs = entry.getAttrs();
                    System.out.println("获取文件名字:------" + filename);
                    // System.out.println("获取文件属性:------"+attrs);
                    //截取最新文件的时间戳
                    String news = filename.substring(filename.indexOf("_") + 1,filename.indexOf("."));
                    if (list==null) {
                        list = new ArrayList();
                    } else {
                        list.add(news);
                    }
                }
                    //下载到本地进行备份
                    System.out.println("------------开始下载文件-----------");
                    //拼接出远程最新文件的地址
                    String SERVER_PATH = SERVER_Url+ list.get(list.size() - 1) + ".txt";
                    sftp.get(SERVER_PATH, SERVER_LOCALPATH, new MyProgressMonitor());
                    //保存到本地地址
                    sftp.quit();
                    if (channel != null) {
                        channel.disconnect();
                    }
                    //遍历出最新文件
                    Collections.sort(list);
                    pathend = list.get(list.size() - 1);
                    System.out.println("遍历出最新的文件:" + pathend);
                    // 插入数据库
                    if (!list.isEmpty()) {
                        String DOWN_PATH = LOCAl_URL + list.get(list.size() - 1)+ ".txt";
                        System.out.println("输出最新的文件:" + DOWN_PATH);
                        readTxtFile(DOWN_PATH);
                    }
                
            }
        } catch (SftpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return pathend;
    }
    /**
     * 把本地数据保存到数据库里面
     */
    public static void readTxtFile(String filePath) {
        try {
            BufferedReader bufferedReader = null;
            Connection conn = null;
            String driver = "com.mysql.jdbc.Driver";
            Statement stmt = null;
            try {
                Class.forName(driver);
                conn = DriverManager.getConnection(MYSQL_URL, MYSQL_USERNAME,MYSQL_USERPASSWORD);// 账户和密码
                String encoding = "utf-8";
                File file = new File(filePath);
                // 判断文件是否存在
                if (file.isFile() && file.exists()) {
                    InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
                    bufferedReader = new BufferedReader(read);
                    String lineTxt = null;
                    int line = 0;
                    while ((lineTxt = bufferedReader.readLine()) != null) {
                        line++;
                        // 跳出第一行汉字
                        if (line == 1) {
                            continue;
                        }
                        String[] strs = lineTxt.split(",");
                        System.out.println("数组的长度:" + strs.length);
                        System.out.println("----------------------------开始导入数据----------------------------------");
                        String sql = "insert 数据表名() values()";
                        PreparedStatement pstmt = conn.prepareStatement(sql);
                        pstmt.setInt(1, 0);// id
                        pstmt.setString(2, strs[0]);// 券码
                        System.out.println("券号是:" + strs[0]);
                        pstmt.setDouble(3, Double.parseDouble(strs[1]));// 没打折前的价格
                        System.out.println("没打折前的价格是:" + strs[1]);
                        pstmt.setString(4, " ");
                        pstmt.setString(5, " ");
                        pstmt.setString(6, strs[3]);
                        System.out.println("汽油:" + strs[3]);
                        pstmt.setDouble(7, 0.0);// amount
                        pstmt.setDouble(8, Double.parseDouble("0"));
                        System.out.println("消费:" + strs[5]);
                        pstmt.setInt(9, 0);// uid
                        pstmt.setInt(10, 0);
                        pstmt.setString(11, " ");
                        pstmt.setString(12, " ");
                        pstmt.setString(13, " ");
                        pstmt.setString(14, " ");
                        pstmt.setString(15, " ");
                        pstmt.setInt(16, 0);
                        pstmt.setString(17, " ");
                        pstmt.setInt(18, 0);
                        pstmt.executeUpdate();
                    }
                    read.close();
                } else {
                    System.out.println("找不到指定的文件");
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    conn.close();
                    bufferedReader.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            System.out.println("读取文件内容出错");
            e.printStackTrace();
        }
    }
    /**
     * 通过SFTP连接服务器
     */
    public void connect() {
        try {
            JSch jsch = new JSch();
            jsch.getSession(host, username,port);
            sshSession = jsch.getSession(username, host, port);
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.setTimeout(TIMOUT);
            sshSession.connect();
            channel = sshSession.openChannel("sftp");
            channel.connect();
            System.out.println("JSch版本号:" + sshSession.getClientVersion());
            sftp = (ChannelSftp) channel;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Vector listFiles(String directory) throws SftpException {
        return sftp.ls(directory);
    }
    public SFTPDownload(String host, String username, String password,int timout) {
        this.host = host;
        this.timout=timout;
        this.username = username;
        this.password = password;
    }
}

配置文件:

    在这里写配置文件的原因是:代码更灵活 把程序打包成jar包时 在配置文件中修改所需要的信息就可以

    配置文件的名称以.properties命名最为规范 

    从SFTP到代码移植Liunx 环境_第2张图片

 

在这需要注意的是:配置文件格式是已经key-value的形式存在 key字段不允许改变 只允许改变value值

还有一个坑在往数据库插入数据的时候你要检查表字段是否是mysql的关键字 以下错误就是表字段与mysql关键字重名

SFTP服务器部署本地环境:

    点击详细教程

    

用Xshell连接远程服务器:

   一. 输入:vi /etc/profile命令

        

   二.  在命令行输入G后出现:配置环境变量文件详细信息

        从SFTP到代码移植Liunx 环境_第3张图片

    配置完成后用命令 java  javac java-version 进行检查环境变量是否成功 

    注意:PATH=$PATH后面的变量是  系统全局命令的路径,不配置linux系统下的命令不能用

    三.在命令输入小写i后进行编辑

    四.按Ese键--------insert-------字样消失

    五.在输入框内输入:x进行保存并退出 

    

    程序打包成可执行的.jar文件在这里是用eclipse进行打包的

      从SFTP到代码移植Liunx 环境_第4张图片

在这个文件中需注意的地方用红线标出来了   

      

    现在运行一下打包成.jar文件

从SFTP到代码移植Liunx 环境_第5张图片

    

你可能感兴趣的:(后端)