JAVA SFTP文件上传、下载及批量下载实例
作者:meimao5211 发布时间:2023-02-11 14:31:46
标签:java,sftp
1.jsch官方API查看地址(附件为需要的jar)
http://www.jcraft.com/jsch/
2.jsch简介
JSch(Java Secure Channel)是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。
SFTP(Secure File Transfer Protocol)安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式,但是传输效率比普通的FTP要低。
3.api常用的方法:
put(): 文件上传
get(): 文件下载
cd(): 进入指定目录
ls(): 得到指定目录下的文件列表
rename(): 重命名指定文件或目录
rm(): 删除指定文件
mkdir(): 创建目录
rmdir(): 删除目录
put和get都有多个重载方法,自己看源代码
4.对常用方法的使用,封装成一个util类
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import org.apache.log4j.Logger;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
import com.jcraft.jsch.ChannelSftp.LsEntry;
/**
* sftp工具类
*
* @author xxx
* @date 2014-6-17
* @time 下午1:39:44
* @version 1.0
*/
public class SFTPUtils
{
private static Logger log = Logger.getLogger(SFTPUtils.class.getName());
private String host;//服务器连接ip
private String username;//用户名
private String password;//密码
private int port = 22;//端口号
private ChannelSftp sftp = null;
private Session sshSession = null;
public SFTPUtils(){}
public SFTPUtils(String host, int port, String username, String password)
{
this.host = host;
this.username = username;
this.password = password;
this.port = port;
}
public SFTPUtils(String host, String username, String password)
{
this.host = host;
this.username = username;
this.password = password;
}
/**
* 通过SFTP连接服务器
*/
public void connect()
{
try
{
JSch jsch = new JSch();
jsch.getSession(username, host, port);
sshSession = jsch.getSession(username, host, port);
if (log.isInfoEnabled())
{
log.info("Session created.");
}
sshSession.setPassword(password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.connect();
if (log.isInfoEnabled())
{
log.info("Session connected.");
}
Channel channel = sshSession.openChannel("sftp");
channel.connect();
if (log.isInfoEnabled())
{
log.info("Opening Channel.");
}
sftp = (ChannelSftp) channel;
if (log.isInfoEnabled())
{
log.info("Connected to " + host + ".");
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 关闭连接
*/
public void disconnect()
{
if (this.sftp != null)
{
if (this.sftp.isConnected())
{
this.sftp.disconnect();
if (log.isInfoEnabled())
{
log.info("sftp is closed already");
}
}
}
if (this.sshSession != null)
{
if (this.sshSession.isConnected())
{
this.sshSession.disconnect();
if (log.isInfoEnabled())
{
log.info("sshSession is closed already");
}
}
}
}
/**
* 批量下载文件
* @param remotPath:远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
* @param localPath:本地保存目录(以路径符号结束,D:\Duansha\sftp\)
* @param fileFormat:下载文件格式(以特定字符开头,为空不做检验)
* @param fileEndFormat:下载文件格式(文件格式)
* @param del:下载后是否删除sftp文件
* @return
*/
public List<String> batchDownLoadFile(String remotePath, String localPath,
String fileFormat, String fileEndFormat, boolean del)
{
List<String> filenames = new ArrayList<String>();
try
{
// connect();
Vector v = listFiles(remotePath);
// sftp.cd(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();
if (!attrs.isDir())
{
boolean flag = false;
String localFileName = localPath + filename;
fileFormat = fileFormat == null ? "" : fileFormat
.trim();
fileEndFormat = fileEndFormat == null ? ""
: fileEndFormat.trim();
// 三种情况
if (fileFormat.length() > 0 && fileEndFormat.length() > 0)
{
if (filename.startsWith(fileFormat) && filename.endsWith(fileEndFormat))
{
flag = downloadFile(remotePath, filename,localPath, filename);
if (flag)
{
filenames.add(localFileName);
if (flag && del)
{
deleteSFTP(remotePath, filename);
}
}
}
}
else if (fileFormat.length() > 0 && "".equals(fileEndFormat))
{
if (filename.startsWith(fileFormat))
{
flag = downloadFile(remotePath, filename, localPath, filename);
if (flag)
{
filenames.add(localFileName);
if (flag && del)
{
deleteSFTP(remotePath, filename);
}
}
}
}
else if (fileEndFormat.length() > 0 && "".equals(fileFormat))
{
if (filename.endsWith(fileEndFormat))
{
flag = downloadFile(remotePath, filename,localPath, filename);
if (flag)
{
filenames.add(localFileName);
if (flag && del)
{
deleteSFTP(remotePath, filename);
}
}
}
}
else
{
flag = downloadFile(remotePath, filename,localPath, filename);
if (flag)
{
filenames.add(localFileName);
if (flag && del)
{
deleteSFTP(remotePath, filename);
}
}
}
}
}
}
if (log.isInfoEnabled())
{
log.info("download file is success:remotePath=" + remotePath
+ "and localPath=" + localPath + ",file size is"
+ v.size());
}
}
catch (SftpException e)
{
e.printStackTrace();
}
finally
{
// this.disconnect();
}
return filenames;
}
/**
* 下载单个文件
* @param remotPath:远程下载目录(以路径符号结束)
* @param remoteFileName:下载文件名
* @param localPath:本地保存目录(以路径符号结束)
* @param localFileName:保存文件名
* @return
*/
public boolean downloadFile(String remotePath, String remoteFileName,String localPath, String localFileName)
{
FileOutputStream fieloutput = null;
try
{
// sftp.cd(remotePath);
File file = new File(localPath + localFileName);
// mkdirs(localPath + localFileName);
fieloutput = new FileOutputStream(file);
sftp.get(remotePath + remoteFileName, fieloutput);
if (log.isInfoEnabled())
{
log.info("===DownloadFile:" + remoteFileName + " success from sftp.");
}
return true;
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (SftpException e)
{
e.printStackTrace();
}
finally
{
if (null != fieloutput)
{
try
{
fieloutput.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return false;
}
/**
* 上传单个文件
* @param remotePath:远程保存目录
* @param remoteFileName:保存文件名
* @param localPath:本地上传目录(以路径符号结束)
* @param localFileName:上传的文件名
* @return
*/
public boolean uploadFile(String remotePath, String remoteFileName,String localPath, String localFileName)
{
FileInputStream in = null;
try
{
createDir(remotePath);
File file = new File(localPath + localFileName);
in = new FileInputStream(file);
sftp.put(in, remoteFileName);
return true;
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (SftpException e)
{
e.printStackTrace();
}
finally
{
if (in != null)
{
try
{
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return false;
}
/**
* 批量上传文件
* @param remotePath:远程保存目录
* @param localPath:本地上传目录(以路径符号结束)
* @param del:上传后是否删除本地文件
* @return
*/
public boolean bacthUploadFile(String remotePath, String localPath,
boolean del)
{
try
{
connect();
File file = new File(localPath);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++)
{
if (files[i].isFile()
&& files[i].getName().indexOf("bak") == -1)
{
if (this.uploadFile(remotePath, files[i].getName(),
localPath, files[i].getName())
&& del)
{
deleteFile(localPath + files[i].getName());
}
}
}
if (log.isInfoEnabled())
{
log.info("upload file is success:remotePath=" + remotePath
+ "and localPath=" + localPath + ",file size is "
+ files.length);
}
return true;
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
this.disconnect();
}
return false;
}
/**
* 删除本地文件
* @param filePath
* @return
*/
public boolean deleteFile(String filePath)
{
File file = new File(filePath);
if (!file.exists())
{
return false;
}
if (!file.isFile())
{
return false;
}
boolean rs = file.delete();
if (rs && log.isInfoEnabled())
{
log.info("delete file success from local.");
}
return rs;
}
/**
* 创建目录
* @param createpath
* @return
*/
public boolean createDir(String createpath)
{
try
{
if (isDirExist(createpath))
{
this.sftp.cd(createpath);
return true;
}
String pathArry[] = createpath.split("/");
StringBuffer filePath = new StringBuffer("/");
for (String path : pathArry)
{
if (path.equals(""))
{
continue;
}
filePath.append(path + "/");
if (isDirExist(filePath.toString()))
{
sftp.cd(filePath.toString());
}
else
{
// 建立目录
sftp.mkdir(filePath.toString());
// 进入并设置为当前目录
sftp.cd(filePath.toString());
}
}
this.sftp.cd(createpath);
return true;
}
catch (SftpException e)
{
e.printStackTrace();
}
return false;
}
/**
* 判断目录是否存在
* @param directory
* @return
*/
public boolean isDirExist(String directory)
{
boolean isDirExistFlag = false;
try
{
SftpATTRS sftpATTRS = sftp.lstat(directory);
isDirExistFlag = true;
return sftpATTRS.isDir();
}
catch (Exception e)
{
if (e.getMessage().toLowerCase().equals("no such file"))
{
isDirExistFlag = false;
}
}
return isDirExistFlag;
}
/**
* 删除stfp文件
* @param directory:要删除文件所在目录
* @param deleteFile:要删除的文件
* @param sftp
*/
public void deleteSFTP(String directory, String deleteFile)
{
try
{
// sftp.cd(directory);
sftp.rm(directory + deleteFile);
if (log.isInfoEnabled())
{
log.info("delete file success from sftp.");
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 如果目录不存在就创建目录
* @param path
*/
public void mkdirs(String path)
{
File f = new File(path);
String fs = f.getParent();
f = new File(fs);
if (!f.exists())
{
f.mkdirs();
}
}
/**
* 列出目录下的文件
*
* @param directory:要列出的目录
* @param sftp
* @return
* @throws SftpException
*/
public Vector listFiles(String directory) throws SftpException
{
return sftp.ls(directory);
}
public String getHost()
{
return host;
}
public void setHost(String host)
{
this.host = host;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public int getPort()
{
return port;
}
public void setPort(int port)
{
this.port = port;
}
public ChannelSftp getSftp()
{
return sftp;
}
public void setSftp(ChannelSftp sftp)
{
this.sftp = sftp;
}
/**测试*/
public static void main(String[] args)
{
SFTPUtils sftp = null;
// 本地存放地址
String localPath = "D:/tomcat5/webapps/ASSESS/DocumentsDir/DocumentTempDir/txtData/";
// Sftp下载路径
String sftpPath = "/home/assess/sftp/jiesuan_2/2014/";
List<String> filePathList = new ArrayList<String>();
try
{
sftp = new SFTPUtils("10.163.201.115", "tdcp", "tdcp");
sftp.connect();
// 下载
sftp.batchDownLoadFile(sftpPath, localPath, "ASSESS", ".txt", true);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
sftp.disconnect();
}
}
}
5.需要的时间辅助类,顺带记下,下次可以直接拿来用
/**
* 时间处理工具类(简单的)
* @author Aaron
* @date 2014-6-17
* @time 下午1:39:44
* @version 1.0
*/
public class DateUtil {
/**
* 默认时间字符串的格式
*/
public static final String DEFAULT_FORMAT_STR = "yyyyMMddHHmmss";
public static final String DATE_FORMAT_STR = "yyyyMMdd";
/**
* 获取系统时间的昨天
* @return
*/
public static String getSysTime(){
Calendar ca = Calendar.getInstance();
ca.set(Calendar.DATE, ca.get(Calendar.DATE)-1);
Date d = ca.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String a = sdf.format(d);
return a;
}
/**
* 获取当前时间
* @param date
* @return
*/
public static String getCurrentDate(String formatStr)
{
if (null == formatStr)
{
formatStr=DEFAULT_FORMAT_STR;
}
return date2String(new Date(), formatStr);
}
/**
* 返回年月日
* @return yyyyMMdd
*/
public static String getTodayChar8(String dateFormat){
return DateFormatUtils.format(new Date(), dateFormat);
}
/**
* 将Date日期转换为String
* @param date
* @param formatStr
* @return
*/
public static String date2String(Date date, String formatStr)
{
if (null == date || null == formatStr)
{
return "";
}
SimpleDateFormat df = new SimpleDateFormat(formatStr);
return df.format(date);
}
}
来源:http://www.cnblogs.com/meimao5211/p/6376597.html


猜你喜欢
- 本文实例讲述了Java matches类,Pattern类及matcher类用法。分享给大家供大家参考,具体如下:Pattern类正则表达式
- 问题背景在最近的项目开发中遇到一个需求 需要对mysql做一些慢查询、大结果集等异常指标进行收集监控,从运维角度并没有对mysql进行统一的
- 本文实例为大家分享了Android实现画画板的具体代码,供大家参考,具体内容如下① 准备一个布局文件<?xml version=&qu
- 简单工厂模式概述1.定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类2.在简单工厂模式中用于被创
- 前言ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素实现了
- 本文实例讲述了Android开发实现判断通知栏是否打开及前往设置页面的方法。分享给大家供大家参考,具体如下:项目中用到日程提醒功能,如果应用
- 先给大家展示下效果图:废话不多说了,下面通过示例代码给大家介绍checkbox 多项选择当前的position信息提交,具体代码如下所示:p
- 因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能。我根据网上网友提供的一些资料,自己整合应用到项目中,效
- springboot 取消starter的自动注入starer是spring boot中一个很重要的概念,starter相当于一个模块,它能
- 最近因为工作的原因用到了西门子PLC,在使用过程中一直在思考上位机和PLC的通讯问题,后来上网查了一下,找到了一个专门针对S7开发的一个.n
- 本文实例为大家分享了java实现滑动验证解锁的具体代码,供大家参考,具体内容如下1.html:<div class="dra
- 我们知道现在智能手机上都有这样一种功能,就是你在浏览图片的时候。不是硬性的点击按钮而是可以实现手指的拖动,划开效果。使用户具有更好的交互体验
- 一、坐标分类地图坐标大致分为几种: 1、GPS、WGS84,也就是原始坐标体系,
- 1. 关于POJO类属性为基本类型存在的问题在项目开发中遇到的问题,定义POJO类的时候有些属性定义为了基本数据类型,比如long,shor
- 一、概要介绍 本文要介绍的是Java中的transient关键字,transient是短暂的意思。对于transie
- 一、前言虽然jdk1.9版本已经问世,但是许多其他的配套设施并不一定支持jdk1.9版本,所以这里仅带领你配置jdk1.8。而jdk1.9的
- 简述Preference是Android的控件之一,相对来说我们用的比较少,但在系统应用的Settings设置应用模块中大部分由Prefer
- 1)下载sqlite jdbc驱动http://www.xerial.org/maven/repository/artifact/org/x
- 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还
- 前言前段时间学习Chart控件,对Chart控件的,怕以后忘记,所以总结一下自己的学习成果,怕以后忘记方便自己下次复习。这篇文章只是学习的文