SFTP方式获取文件

部署运行你感兴趣的模型镜像

以获取 .csv 文件为例

需要jar包

jsch-0.1.44.jar

下载链接

http://download.youkuaiyun.com/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”}

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

使用sftp获取对方文件有多种方法,以下为你详细介绍: ### 使用expect脚本免密码获取文件 先安装expect,然后创建脚本。以下是一个示例脚本: ```bash # 安装expect yum install expect -y # 创建脚本 vi experct.sh # 脚本内容 set username "root" set password "123456" set ip "198.21.252.16" spawn sftp $username@$ip expect { "(yes/no)?" {send "yes\r"; expect_continue} "*password*" {send "$password\r"} } expect "sftp>" send "get 对方文件地址 己方地址\r" expect "sftp>" send "exit" ``` 这个脚本使用expect实现了自动交互,可免密码登录并获取文件[^1]。 ### 使用bash脚本配合lftp工具获取文件 以下是一个bash脚本示例: ```bash #!/bin/bash USERNAME="root" PASSWORD="123456" File_NAME="xxx${1}00.tar.gz" File_NAME15="xxx${1}15.tar.gz" File_NAME30="xxx${1}30.tar.gz" File_NAME45="xxx${1}45.tar.gz" DATA_PATH="/home/xxxx" for i in `cat nsn.csv`; do SERVER_IP=`echo $i | cut -f 1 -d ","` LOCAL_PATH=`echo $i | cut -f 2 -d ","` lftp -u ${USERNAME},${PASSWORD} sftp://${SERVER_IP}:22<<EOF lcd ${LOCAL_PATH} cd ${DATA_PATH} get ${File_NAME} get ${File_NAME15} get ${File_NAME30} get ${File_NAME45} bye EOF done ``` 该脚本通过lftp工具循环从多个服务器获取文件,可根据实际情况修改服务器地址、文件名等信息[^4]。 ### 使用JAVA实现从SFTP服务器获取文件信息 若要使用JAVA实现从SFTP服务器获取文件,需要添加依赖库: ```xml <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency> <!-- 处理zip文件带密码的 --> <dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</artifactId> <version>2.10.0</version> </dependency> ``` 借助这些依赖库,可以在JAVA代码中实现与SFTP服务器的交互,获取文件信息等操作[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值