SFTP方式获取文件

以获取 .csv 文件为例

需要jar包

jsch-0.1.44.jar

下载链接

http://download.csdn.net/download/jasonhector/10202973

代码:


import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import com.jcraft.jsch.*;
import org.apache.log4j.Logger;

public class SftpLoad {

    private  static Logger logger = Logger.getLogger(SftpLoad.class);


    /*
     * 从SFTP服务器下载文件
     *
     * @param ftpHost SFTP IP地址
     *
     * @param ftpUserName SFTP 用户名
     *
     * @param ftpPassword SFTP用户名密码
     *
     * @param ftpPort SFTP端口
     *
     * @param ftpPath SFTP服务器中文件所在路径 格式: ftptest/aa
     *
     * @param localPath 下载到本地的位置 格式:H:/download
     *
     * @param fileName 文件名称
     */
    public static void downloadSftpFile(String ftpHost, String ftpUserName,
                                        String ftpPassword, int ftpPort, String ftpPath) throws JSchException {
        Session session = null;
        Channel channel = null;

        JSch jsch = new JSch();
        session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
        session.setPassword(ftpPassword);
        session.setTimeout(100000);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        if(!session.isConnected())
        session.connect();

        channel = session.openChannel("sftp");

        if(!channel.isConnected())
        channel.connect();
        ChannelSftp chSftp = (ChannelSftp) channel;


        try {
            InputStream inputStream = chSftp.get(ftpPath);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
            String line = null;
            while((line = bufferedReader.readLine()) != null){
                line =line.replace("\"","");
                String []info = line.split(",");
                System.out.println("size:"+info.length);

             System.out.println("str:"+line);
             if(info != null)
                 for(int i =0 ;i< info.length;i++)
             System.out.println("str:"+info[i]);

            }

        } catch (Exception e) {
            e.printStackTrace();
            logger.info("download error.");
        } finally {
        //关闭持久连接  谨慎使用  详细见下面说明
            chSftp.quit();
            channel.disconnect();
            session.disconnect();
        }

    }



        public static void main(String []args) {

            String ftpHost = "************";
            String ftpUserName = "*********";
            String ftpPassword = "***********";
            int ftpPort = 22;
            //主机绝对地址
            String ftpPath = "/usr/hanqinet/chinabyte/auto_output_data/201801/CLICKS20180111.csv";

            try {
                SftpLoad.downloadSftpFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath);
            } catch (JSchException e) {
                e.printStackTrace();
            }

    }


}

结果截图:

这里写图片描述

需要注意的地方:

1.finally 中的关闭连接操作,如果方法是在其他类中调用的话 ,不能加

加了 会报 java.io.IOException: Pipe closed

意思就是说方法在获取sftp流的过程中连接遭到中断,就会出现上述异常

具体为什么也不是很清楚

2.读取数据的数组不会保存空值

例如 String s = frank,22,male,,,,,,

String []str = s.split(“,”);

获取到的数组为 {“frank”,”2”,”male”}

猜你喜欢

转载自blog.csdn.net/JasonHector/article/details/79046945
今日推荐