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
0
投稿
猜你喜欢
- thymeleaf介绍简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP
- 提示:IntelliJ IDEA以下简称IDEA;####IntelliJ IDEA 配置git:需要的材料:一、git.exe二、配置gi
- Swagger是一款遵循 Restful 风格的接口文档开发神器,支持基于 API 自动生成接口文档,接口文档始终与 API 保持同步,不再
- java 读取本地文件实例详解用javax.xml、w3c解析实例代码:package cn.com.xinli.monitor.utils
- 我们都知道单精度浮点数(Single,float,Real)由32位0或1组成,它具体是如何来的。浮点数的32位N=1符号位(Sign)+8
- 1.算法效率算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。时间复杂度主要衡
- 1.官方地址:http://mybatis.plus/guide/generator.html#%E4%BD%BF%E7%94%A8%E6%
- java 泛型方法:泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test
- 一、前言我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端
- 1.比较两个字符串时使用“==”还是equals()方法?当然是equals方法。“==”测试的是两个对象的引用是否相同,而equals()
- 问题springboot 集成springcloud时常常由于版本问题而报错,如下:com.sun.jersey.api.client.Cl
- 本文实例讲述了Java使用Thread和Runnable的线程实现方法。分享给大家供大家参考,具体如下:一 使用Thread实现多线程模拟铁
- C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数。需要说明的是,iostream头文件
- 使用ehcache-spring-annotations使得在工程中简单配置即可使用缓存下载地址:http://code.google.co
- 本文实例为大家分享了Flutter自定义圆盘取色器的具体代码,供大家参考,具体内容如下下面展示一些 内联代码片。圆盘取色器效果图完整代码im
- SimpleDateFormat进行日期格式化1.为啥要用SimpleDateFormat众所周知,Java中的日期类是Date,然后日期默
- 文件资源操作Spring 定义了一个 org.springframework.core.io.Resource 接口,Resource 接口
- ErrorPageFilter的实际应用Spring框架错误页过滤器springboot提供了一个ErrorPageFilter,用来处理当
- 最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结。1、继承Thread类实现多线程继承Thread类的方法
- 导入依赖(pom.xml) <!--整合Shiro安全框架--> <dependency>