java怎么解压sftp的⽂件_java使⽤sftp与linux之间进⾏⽂件传
输解压
最近有个需求是上传⼀个压缩包到服务器并实现解压缩,⽹上了⼏个使⽤ftp上传的例⼦但是没有实现,各⽅⾯总结加上⾃⼰的理解编写,最后使⽤sftp进⾏涉及,最后实现了⽂件的上传、下载、删除、解压缩以及⽂件夹的创建。特此记录下⼀下,以便不时之需。
1.简单了解 ftp和sftp的区别
在linux系统中,最长使⽤到的⽂件传输的⽅式莫过于ftp和sftp.
FTP(File Transfer Protocol),即⽂件传输协议,⽤于Internet上控制⽂件的双向传输。
FTP在linux系统中,传输默认的端⼝为21端⼝,通常以ASCII码和⼆进制的⽅式传输数据,⽀持主动模式和被动模式两种⽅式。
但Linux默认是不提供ftp的,需要你额外安装FTP服务器。
SFTP(Secure File Transfer Protocol),即⽂件加密传输协议,
SFTP在linux系统中,传输默认的端⼝为22端⼝,这种传输⽅式更为安全,传输双⽅既要进⾏密码安全验证,还要进⾏基于密钥的安全验证,有效的防⽌了“中间⼈”的威胁和攻击。
在使⽤linux的centos服务器系统中,两个⽐较起来,ftp传输会⽐sftp传输速率快,毕竟sftp牺牲了⼀定的效率,以保证传输过程的安全。
2.简单了解ChannelSftp类
ChannelSftp类是JSch实现SFTP核⼼类,它包含了所有SFTP的⽅法,如:
put(): ⽂件上传
get(): ⽂件下载
cd(): 进⼊指定⽬录
ls(): 得到指定⽬录下的⽂件列表
rename(): 重命名指定⽂件或⽬录
rm(): 删除指定⽂件
mkdir(): 创建⽬录
rmdir(): 删除⽬录
还有很多⽅法,有需要去看源码
2.代码
直接贴代码,⾥⾯有注释
SFTPInfo
linux的环境参数
s.file2linux;
/**
* @version: 1.0
* @Description:⽂件上传的环境配置
* @author: zshuai
* @date: 2019年4⽉9⽇
*/
public class SFTPInfo {
public static final String SFTP_REQ_HOST = "192.168.189.138"; //ip public static final String SFTP_REQ_USERNAME = "root"; //username public static final String SFTP_REQ_PASSWORD = "rootzs"; //password public static final int SFTP_DEFAULT_PORT = 22; //端⼝
}
SFTPUtil
s.file2linux;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.opensymphony.xwork2.util.finder.ClassFinder.Info;
/**
* @version: 1.0
* @Description:⽂件上传/删除/解压缩
* @author: zshuai
* @date: 2019年4⽉9⽇
*/
public class SFTPUtil {
private static final Logger LOG = Logger(SFTPUtil.class); /*
* @Description: 获取⽂件上传的安全通道
* @param session
* @return
*/
public static Channel getChannel(Session session) {
Channel channel = null;
try {
channel = session.openChannel("sftp");
System.out.println("获取连接成功");
LOG.info("get Channel success!");
} catch (JSchException e) {
LOG.info("get Channel fail!", e);
}
return channel;
}
/*
* @Description:获取连接信息,返回session,在session中获取安全通道
* @param host:连接主机ip
* @param port:端⼝号,⼀般sftp依托于ssh。端⼝号22
* @param username:⽤户名
* @param password:密码
* @return
*/
public static Session getSession(String host, int port, String username, final String password) { Session session = null;
try {
JSch jsch = new JSch();
session = Session(username, host, port);
session.setPassword(password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
session.setConfig(sshConfig);
LOG.info("Session connected!");
} catch (JSchException e) {
LOG.info("get Channel failed!", e);
}
return session;
}
/*
* @Description:创建⽂件夹
* @param sftp
* @param dir : 创建的⽂件夹名字
*/
public static Boolean mkdir(String dir) {
Session s = getSession(SFTPInfo.SFTP_REQ_HOST, SFTPInfo.SFTP_DEFAULT_PORT, SFTPInfo.SFTP_REQ_USERNAME, SFTPInfo.SFTP_REQ_PASSWORD);
Channel channel = getChannel(s);
ChannelSftp sftp = (ChannelSftp) channel;
Boolean result = false;
try {
sftp.cd("/");//相当于在linux命令⾏执⾏cd / ,然后在打开的⽬录下创建
sftp.mkdir(dir);
System.out.println("创建⽂件夹成功!");
result = true;
} catch (SftpException e) {
System.out.println("创建⽂件夹失败!");
result =false;
e.printStackTrace();
}
return result;
}
/*
* @Description: ⽂件上传的⽅法
* @param sftp : 客户端
* @param dir : 指定上传⽂件的⽬录
* @param file : 上传的⽂件
* @return :
*/
public static Boolean uploadFile(String dir, File file) {
Session s = getSession(SFTPInfo.SFTP_REQ_HOST, SFTPInfo.SFTP_DEFAULT_PORT, SFTPInfo.SFTP_REQ_USERNAME, SFTPInfo.SFTP_REQ_PASSWORD);
Channel channel = getChannel(s);
ChannelSftp sftp = (ChannelSftp) channel;
Boolean result =false;
try {
sftp.cd("/"+dir);
System.out.println("打开⽬录");
if (file != null) {
sftp.put(new FileInputStream(file), Name());
result = true;
} else {
result = false;
}
} catch (Exception e) {
LOG.info("上传失败!", e);
java怎么编写result = false;
}
closeAll(sftp, channel, s); // 关闭连接
return result;
}
/**
* @Description: ⽂件下载
* @param directory 下载⽬录
* @param downloadFile 下载的⽂件
* @param saveFile 存在本地的路径
* @param sftp
*/
public static Boolean download(String directory, String downloadFile, String saveFile) {
Session s = getSession(SFTPInfo.SFTP_REQ_HOST, SFTPInfo.SFTP_DEFAULT_PORT, SFTPInfo.SFTP_REQ_USERNAME,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论