JSch教程使用sftp协议实现服务器文件载操作
作者:kl 发布时间:2023-10-29 17:43:33
标签:JSch,sftp,服务器,文件操作
Jsch是什么?
JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器
Jsch功能很强大,博主这里主要用来做文件操作
怎么使用?
添加jar依赖
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
我把我的SftpUtil贴下面了,注释还算清楚
/**
* Content :sftp协议文件上传下载
* Created by kl on 2016/5/6.
*/
public class SftpUtil {
/**
* 上传文件到指定服务器
* @param ip 连接ip
* @param user 用户名
* @param psw 密码
* @param port 端口 <=0 为默认端口
* @param fielPath 上传的服务器路径
* @param serverFileName 服务器保存的文件名
* @param instream 要上传的文件流
* @throws Exception
*/
public static void sftpFileUpload(String ip,int port, String user, String psw, String fielPath,String serverFileName,InputStream instream) throws Exception {
Session session =getSession( ip, user, psw, port);
Channel channel = null;
try {
//创建sftp通信通道
channel = (Channel) session.openChannel("sftp");
channel.connect(1000);
ChannelSftp sftp = (ChannelSftp) channel;
//进入服务器指定的文件夹
sftp.cd(fielPath);
OutputStream outstream = sftp.put(serverFileName);
byte b[] = new byte[1024*200];//每次传输200k
int n;
while ((n = instream.read(b)) != -1) {
outstream.write(b, 0, n);
}
outstream.flush();
outstream.close();
instream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.disconnect();
if (channel!=null)channel.disconnect();
}
}
/**
* 从指定服务器下载文件到本地
* @param ip 连接ip
* @param user 用户名
* @param psw 密码
* @param port 端口 <=0 为默认端口
* @param fielPath 服务器文件路径
* @param serverFileName 要下载的文件名
* @param outputStream 输出到本地的文件流
* @throws Exception
*/
public static void sftpFileDownload(String ip,int port, String user, String psw, String fielPath,String serverFileName,OutputStream outputStream) throws Exception {
Session session =getSession( ip, user, psw, port);
Channel channel = null;
try {
//创建sftp通信通道
channel = (Channel) session.openChannel("sftp");
channel.connect(1000);
ChannelSftp sftp = (ChannelSftp) channel;
//进入服务器指定的文件夹
sftp.cd(fielPath);
sftp.get(serverFileName,outputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.disconnect();
if (channel!=null)channel.disconnect();
}
}
/**
* 删除服务器指定文件
* @param ip 连接ip
* @param user 用户名
* @param psw 密码
* @param port 端口 <=0 为默认端口
* @param fielPath 服务器文件路径
* @param serverFileName 要删除的文件名
* @throws Exception
*/
public static void sftpFileDelete(String ip,int port, String user, String psw, String fielPath,String serverFileName) throws Exception {
Session session =getSession( ip, user, psw, port);
Channel channel = null;
try {
//创建sftp通信通道
channel = (Channel) session.openChannel("sftp");
channel.connect(1000);
ChannelSftp sftp = (ChannelSftp) channel;
//进入服务器指定的文件夹
sftp.cd(fielPath);
sftp.rm(serverFileName);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.disconnect();
if (channel!=null)channel.disconnect();
}
}
/**
* 查看指定目录所有文件
* @param ip
* @param user
* @param psw
* @param port
* @param fielPath
* @throws Exception
*/
public static Vector seeServerFileList(String ip, int port,String user, String psw, String fielPath)throws Exception{
Session session =getSession( ip, user, psw, port);
Channel channel = null;
Vector v=null;
try {
//创建sftp通信通道
channel = (Channel) session.openChannel("sftp");
channel.connect(1000);
ChannelSftp sftp = (ChannelSftp) channel;
//进入服务器指定的文件夹
sftp.cd(fielPath);
//列出服务器指定的文件列表
v = sftp.ls(fielPath);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.disconnect();
if (channel!=null)channel.disconnect();
}
return v;
}
/**
* 连接服务器
* @param ip 服务器地址
* @param user 用户名
* @param psw 密码
* @param port 连接端口
* @return
* @throws Exception
*/
public static Session getSession(String ip, String user, String psw, int port)throws Exception{
Session session = null;
JSch jsch = new JSch();
if (port <= 0) {
//连接服务器,采用默认端口
session = jsch.getSession(user, ip);
} else {
session = jsch.getSession(user, ip, port);
}
//如果服务器连接不上,则抛出异常
if (session == null) {
throw new Exception("sftp session is null");
}
session.setPassword(psw);//设置密码
//设置登陆超时时间
session.connect(30000);//30s
return session;
}
}
来源:http://www.kailing.pub/article/index/arcid/105.html
0
投稿
猜你喜欢
- 前几天在跟公司大佬讨论一个问题时,看到他使用Handler的一种方式,旁边的同事在说:以前不是这么用的啊。这个问题引发了我的好奇,虽然当时翻
- 编码&解码 通过下图我们可以了解在javaWeb中有哪些地方有转码:用户想服务器发送一个HTTP请求,需要编码的地方有ur
- 综述在Android系统中,出于对性能优化的考虑,对于Android的UI操作并不是线程安全的。也就是说若是有多个线程来操作UI组件,就会有
- 本文实例讲述了Android编程实现WebView添加进度条的方法。分享给大家供大家参考,具体如下:标准的XML界面<?xml ver
- 一个错误:多线程使用单一消费者下图显现了一种错误的使用KafkaConsumer的方法创建多个线程用来消费kafka数据多线程使用同一个Ka
- SSM Mapper查询出返回数据查不到个别字段原因开启了驼峰命名法则,Bean里的字段不识别_注释掉或者把实体类里的字段_去掉换位大写SS
- Java程序有的时候在主线程中会创建多个线程去执行任务,然后在主线程执行完毕之前,把所有线程的任务进行汇总,以前可以用线程的join方法,但
- [LeetCode] 2. Add Two Numbers 两个数字相加You are given two non-empty&n
- SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-
- 悲观锁和乐观锁是面试高频问题之一,本文将对悲观锁和乐观锁简单的进行一个介绍。悲观锁(Pessimistic Locking)悲观锁在并发环境
- 简介备忘录设计模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于实现防丢失、撤销、恢复等功能。
- 逆时针画圆弧,原理:将360度分割成36份,分别标出每10度角度时的坐标点,然后将每个点连接起来。 #include <io
- 以前就遇到过这个问题,今天重新拾起来。跑马灯效果其实就是当文字超过TextView控件宽度的时候,使用滚动的方式显示出来:方法1:(直接xm
- 前言近期一直在忙项目,我也是打工仔。不多说,我们开始玩一玩seata。什么都不说,我们按照惯例,先上一个图(图里不规范的使用请忽略):简单一
- 1、mybatis-plus @DS实现动态切换数据源原理首先mybatis-plus使用com.baomidou.dynamic.data
- 第1部分 ArrayList介绍ArrayList简介ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量
- Servlet3.0的出现是servlet史上最大的变革,其中的许多新特性大大的简化了web应用的开发,为广大劳苦的程序员减轻了压力,提高了
- Android中的异步消息机制分为四个部分:Message、Handler、MessageQueue和Looper。其中,Message是线
- Java 2D API通过扩展抽象窗口工具箱(AWT),为Java程序提供了二维图像,文本和图形的功能。这个复杂的渲染包支持线形图像,文本和
- 本文实例为大家分享了Android实现双曲线折线图的具体代码,供大家参考,具体内容如下先看一下效果图1.先下载jar包 mpandroidc