package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* sftp工具类
*
* @author xxx
* @date 2020-12-17
* @time 下午3:57:44
* @version 1.0
*/
public class SFTPUtils {
private String host = ""; // 服务器连接ip
private String username = ""; // 用户名
private String password = ""; // 密码
private int port = 22; // 端口号
public SFTPUtils() {
}
public SFTPUtils(String host, int port, String username, String password) {
= host;
= username;
= password;
= port;
}
public SFTPUtils(String host, String username, String password) {
= host;
= username;
= password;
}
/**
* 连接sshSession
*/
public Session sshSession() {
Session sshSession = null;
JSch jsch = new JSch();
while (true) {
try {
(username, host, port);
sshSession = (username, host, port);
(password);
// Properties sshConfig = new Properties();
// ("StrictHostKeyChecking", "no");
// ("kex", "diffie-hellman-group1-sha1");
("StrictHostKeyChecking", "no");
// ("StrictHostKeyChecking", "no");
// (sshConfig);
();
return sshSession;
} catch (Exception e) {
// TODO Auto-generated catch block
try {
(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
();
}
();
}
}
}
/**
* sshSession通过sshSession连接ChannelSftp(SFTP)
*/
public ChannelSftp connect(Session sshSession) {
ChannelSftp sftp = null;
Channel channel = null;
while (true) {
try {
channel = ("sftp");
();
sftp = (ChannelSftp) channel;
Class cl = ;
Field f1 =("server_version");
(true);
(sftp, 2);
("gbk");
return sftp;
} catch (JSchException e) {
try {
(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
();
}
sshSession = sshSession();
// TODO Auto-generated catch block
();
} catch (SftpException e) {
// TODO Auto-generated catch block
try {
(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
();
}
();
} catch (SecurityException e) {
try {
(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
();
}
// TODO Auto-generated catch block
();
} catch (NoSuchFieldException e) {
try {
(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
();
}
// TODO Auto-generated catch block
();
} catch (IllegalArgumentException e) {
try {
(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
();
}
// TODO Auto-generated catch block
();
} catch (IllegalAccessException e) {
try {
(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
();
}
// TODO Auto-generated catch block
();
}
}
}
/**
* 关闭ChannelSftp,Session连接
*/
public void disconnect(ChannelSftp sftp, Session sshSession) {
if (sftp != null) {
if (()) {
();
}
}
if (sshSession != null) {
if (()) {
();
}
}
}
/**
* 批量获取XML文件流
*
* @param remotPath
* :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
* @param indexOfFileName
* :获取某一天的文件(yyyyMMdd)
* @param indexOfFileNameXiaJi
* :获取某一天的文件下级文件夹res或者req或者什么文件夹名
* @param ctx
*
* @param yinhang
* :银行简称以_符号结束(BOC_)
* @param sftp
* :
* @param sshSession
* :
* @return filenames :文件名称以及文件流 (Map<String, InputStream>)
*/
public Map<String, InputStream> batchDownLoadFileXml(String remotePath,
String indexOfFileName, String indexOfFileNameXiaJi,
String yinhang, Context ctx, ChannelSftp sftp, Session sshSession) {
Map<String, InputStream> filenames = new HashMap<String, InputStream>();
;
Vector v = listFiles(remotePath, sftp);
// (remotePath);
if (() > 0) {
("本次处理文件个数不为零,开始下载...fileSize=" + ());
Iterator it = ();
while (()) {
LsEntry entry = (LsEntry) ();
String filename = ();
SftpATTRS attrs = ();
if (!()) {
// boolean flag = false;
int lastIndexOf = 0;
if ((indexOfFileName) != -1) {
// String localFileName = + filename;
remoteZipToFile(remotePath + filename, remotePath,
sshSession);
lastIndexOf = (".");
Vector v1 = listFiles(remotePath + indexOfFileName
+ "/" + indexOfFileNameXiaJi, sftp);
// (remotePath);
if (() > 0) {
Iterator it1 = ();
List<String> allList = new ArrayList<String>();
List<String> dbList = dbList(remotePath,
indexOfFileName, indexOfFileNameXiaJi,
yinhang, "HIS\\|CUR\\", ctx, sshSession);
List<String> chaZhiList = null;
if (dbList != null) {
remoteZipToFileHouZhui(remotePath, indexOfFileName,
indexOfFileNameXiaJi, "BAL", sshSession);
("本次读取文件个数不为零,读取...fileSize="
+ ());
while (()) {
LsEntry entry1 = (LsEntry) ();
String filename1 = ();
SftpATTRS attrs1 = ();
if (!()) {
int lastIndexOf1 = filename1
.lastIndexOf(".");
String suffix = filename1
.substring(lastIndexOf1);
if (().equals(".CUR")
|| ().equals(
".HIS")) {
(filename1);
}
}
}
}
if ("res".equals(indexOfFileNameXiaJi)) {
chaZhiList = getNeedAddOpenList(allList, dbList);
} else {
chaZhiList = allList;
}
InputStream is = null;
String filename1 = null;
for (int i = 0; i < (); i++) {
filename1 = (i);
while (true) {
try {
is = (remotePath
+ (0,
lastIndexOf) + "/"
+ indexOfFileNameXiaJi + "/"
+ filename1);
break;
} catch (SftpException e) {
// TODO Auto-generated catch block
try {
(5000);
sftp = connect(sshSession());
} catch (Exception e1) {
// TODO Auto-generated catch block
();
}
();
}
}
// TODO 编码定义
BufferedReader bre;
try {
bre = new BufferedReader(
new InputStreamReader(is, "GBK"));
StringBuffer a = new StringBuffer();
String str = "";
// 循环读取,一次读取一行
while ((str = ()) != null) {
(str);
}
if (("<?xml") < 0) {
a
.insert(0,
"<?xml version=\"1.0\" encoding=\"GBK\"?>");
}
String a1 = ().replace("UTF-8",
"GBK");
a1 = ().replace("utf-8", "GBK");
is = new ByteArrayInputStream(());
(filename1, is);
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
();
} catch (IOException e) {
// TODO Auto-generated catch block
();
}
try {
();
} catch (IOException e) {
// TODO Auto-generated catch
// block
();
}
}
}
rm(remotePath + (0, lastIndexOf),
sshSession);
break;
}
}
}
}
return filenames;
}
/**
* 判断list差值 :
*
* @return filenames :文件名称以及文件流 (Map<String, InputStream>)
*/
public List<String> getNeedAddOpenList(List<String> allList,
List<String> dbList) {
if (dbList != null && !()) {
Map<String, String> dataMap = new HashMap<String, String>();
for (String filename : dbList) {
(filename, filename);
}
List<String> newList = new ArrayList<String>();
for (String filename : allList) {
if (!(filename)) {
(filename);
}
}
return newList;
} else {
return allList;
}
}
/**
* 判断list差值
*
* @param remotPath
* :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
* @param indexOfFileName
* :某一天的文件夹(yyyyMMdd)
* @param indexOfFileNameXiaJi
* :某一天的文件夹下级文件夹res或者req或者什么文件夹名
* @param houZ*g
* :文件后缀名HIS\|CUR\
* @param sshSession
* : :文件名称以及文件流 (Map<String, InputStream>)
*/
public List<String> dbList(String remotePath, String indexOfFileName,
String indexOfFileNameXiaJi, String yinHang, String houZ*g,
Context ctx, Session sshSession) {
int i = 4;
int dbSum = 0;
String tiaojian2 = "SUBSTR(cfyinhangfilename,2" + i + ",8)";
if ("CMBC_".equals(yinHang)) {
i = 5;
tiaojian2 = "SUBSTR(cfyinhangfilename,2" + (i + 1) + ",8)";
} else if ("CIB_".equals(yinHang)) {
tiaojian2 = "SUBSTR(cfyinhangfilename,2" + (i + 1) + ",8)";
}
List dbList = null;
try {
IRowSet irfileName = (ctx,
"/*dialect*/ SELECT count(*) FROM CT_JIA_XMLFILENAME where SUBSTR(cfyinhangfilename,0,"
+ i + ") = '" + yinHang + "' and " + tiaojian2
+ " ='" + indexOfFileName + "' and CFzhuangtai = 1 ");
while (()) {
dbSum = (1);
}
if (dbSum != getHouZ*gFileSum(remotePath, indexOfFileName,
indexOfFileNameXiaJi, houZ*g, sshSession)) {
dbList = new ArrayList();
irfileName = DbUtil
.executeQuery(
ctx,
" /*dialect*/ SELECT SUBSTR(cfyinhangfilename,"+(i+ 1)+ ",100) FROM CT_JIA_XMLFILENAME where SUBSTR(cfyinhangfilename,0,"
+ i + ") = '" + yinHang + "' and "
+ tiaojian2 + " ='" + indexOfFileName
+ "' and CFzhuangtai = 1");
while (()) {
((1));
}
String logsql =" /*dialect*/ delete FROM CT_JIA_XMLLOG where cfyinhangfilename in (SELECT cfyinhangfilename FROM CT_JIA_XMLFILENAME " +
"where SUBSTR(cfyinhangfilename,0,"
+ i + ") = '" + yinHang + "' and "
+ tiaojian2 + " ='" + indexOfFileName
+ "' and CFzhuangtai <>1 )" ;
(
ctx,
logsql);
try {
(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
();
}
String filenamesql = " /*dialect*/ delete FROM CT_JIA_XMLFILENAME where SUBSTR(cfyinhangfilename,0,"
+ i + ") = '" + yinHang + "' and "
+ tiaojian2 + " ='" + indexOfFileName
+ "' and CFzhuangtai <>1 ";
(
ctx,
filenamesql);
return dbList;
}else{
return null;
}
} catch (BOSException e) {
// TODO Auto-generated catch block
();
} catch (SQLException e) {
// TODO Auto-generated catch block
();
}
return dbList;
}
/**
* 批量获取EXCEL文件流
*
* @param remotPath
* :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
* @param indexOfFileName
* :获取某一天的文件(yyyyMMdd)
* @param indexOfFileNameXiaJi
* :获取某一天的文件下级文件夹res或者req或者什么文件夹名
* @param ctx
*
* @param yinhang
* :银行简称以_符号结束(BOC_)
* @param sftp
* :
* @param sshSession
* :
* @return filenames :文件名称以及文件流 (Map<String, InputStream>)
*/
public Map<String, Workbook> batchDownLoadFileexcel(String remotePath,
String indexOfFileName, String indexOfFileNameXiaJi,
ChannelSftp sftp, Session sshSession) {
Map<String, Workbook> filenames = new HashMap<String, Workbook>();
Vector v1 = listFiles(remotePath + "/" + indexOfFileName + "/"
+ indexOfFileNameXiaJi + "/", sftp);
// remotePath +"/"+ indexOfFileName
// + "/交易记录表");
// /data/msxg
// (remotePath);
if (() > 0) {
("本次读取excel文件个数不为零,读取...fileSize=" + ());
Iterator it1 = ();
while (()) {
LsEntry entry1 = (LsEntry) ();
String filename1 = ();
SftpATTRS attrs1 = ();
if (!()) {
int lastIndexOf1 = (".");
String suffix = (lastIndexOf1);
if (().equals(".XLSX")
|| ().equals(".XLS")) {
// remotePath+(0,
// lastIndexOf)+filename1;
InputStream is = null;
while (true) {
try {
is = (// "/data/msxg/"+filename1);
remotePath + "/" + indexOfFileName
+ "/" + indexOfFileNameXiaJi
+ "/" + filename1);
break;
} catch (SftpException e) {
// TODO Auto-generated catch block
try {
(5000);
sftp = connect(sshSession());
} catch (Exception e1) {
// TODO Auto-generated catch block
();
}
();
}
}
Workbook wb1 = null;
try {
wb1 = (filename1, is);
} catch (IOException e1) {
// TODO Auto-generated catch block
();
}
(filename1, wb1);
try {
();
} catch (IOException e) {
// TODO Auto-generated catch
// block
();
}
}
}
}
}
return filenames;
}
/**
* 批量下载文件
*
* @param remotPath
* :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
* @param localPath
* :本地保存目录(以路径符号结束,D:\Duansha\sftp\)
* @param del
* :下载后是否删除sftp文件
* @return
*/
public List<String> batchDownLoadFile(String remotePath, String localPath,
boolean del, ChannelSftp sftp) {
List<String> filenames = new ArrayList<String>();
// connect();
Vector v = listFiles(remotePath, sftp);
// (remotePath);
if (() > 0) {
("本次处理文件个数不为零,开始下载...fileSize=" + ());
Iterator it = ();
while (()) {
LsEntry entry = (LsEntry) ();
String filename = ();
SftpATTRS attrs = ();
if (!()) {
boolean flag = false;
String localFileName = localPath + filename;
// 三种情况
flag = downloadFile(remotePath, filename, localPath,
filename, sftp);
if (flag) {
(localFileName);
if (flag && del) {
deleteSFTP(remotePath, filename, sftp);
}
}
}
}
}
return filenames;
}
/*
* 远程下载目录(以路径符号结束)
*
* @param remoteFileName :下载文件名
*
* @param localPath :本地保存目录(以路径符号结束)
*
* @param localFileName :保存文件名
*
* @return
*/
public boolean downloadFile(String remotePath, String remoteFileName,
String localPath, String localFileName, ChannelSftp sftp) {
FileOutputStream fieloutput = null;
try {
// (remotePath);
File file = new File(localPath + "/" + localFileName);
if (!()) {
mkdirs(localPath + localFileName);
}
fieloutput = new FileOutputStream(file);
(remotePath + remoteFileName, fieloutput);
return true;
} catch (FileNotFoundException e) {
();
} catch (SftpException e) {
();
} finally {
if (null != fieloutput) {
try {
();
} catch (IOException e) {
();
}
}
}
return false;
}
/**
* 上传单个文件
*
* @param remotePath
* :远程保存目录
* @param remoteFileName
* :保存文件名
* @param localPath
* :本地上传目录(以路径符号结束)
* @param localFileName
* :上传的文件名
* @return
*/
public boolean uploadFile(String remotePath, String remoteFileName,
String localPath, String localFileName, ChannelSftp sftp,
Session sshSession) {
FileInputStream in = null;
try {
createDir(remotePath, sftp, sshSession);
File file = new File(localPath + localFileName);
in = new FileInputStream(file);
(in, remoteFileName);
return true;
} catch (FileNotFoundException e) {
();
} catch (SftpException e) {
();
} finally {
if (in != null) {
try {
();
} catch (IOException e) {
();
}
}
}
return false;
}
/**
* 批量上传文件
*
* @param remotePath
* :远程保存目录
* @param localPath
* :本地上传目录(以路径符号结束)
* @param del
* :上传后是否删除本地文件
* @return
*/
public boolean bacthUploadFile(String remotePath, String localPath,
boolean del, ChannelSftp sftp, Session sshSession) {
try {
connect(sshSession);
File file = new File(localPath);
File[] files = ();
for (int i = 0; i < ; i++) {
if (files[i].isFile()
&& files[i].getName().indexOf("bak") == -1) {
if ((remotePath, files[i].getName(),
localPath, files[i].getName(), sftp, sshSession)
&& del) {
deleteFile(localPath + files[i].getName());
}
}
}
return true;
} catch (Exception e) {
();
}
return false;
}
/**
* 删除本地文件
*
* @param filePath
* @return
*/
public boolean deleteFile(String filePath) {
File file = new File(filePath);
if (!()) {
return false;
}
if (!()) {
return false;
}
boolean rs = ();
return rs;
}
/**
* 创建目录
*
* @param createpath
* @return
*/
public boolean createDir(String createpath, ChannelSftp sftp,
Session sshSession) {
try {
if (isDirExist(createpath, sftp)) {
(createpath);
return true;
}
String pathArry[] = ("/");
StringBuffer filePath = new StringBuffer("/");
for (String path : pathArry) {
if (("")) {
continue;
}
(path + "/");
if (isDirExist((), sftp)) {
(());
} else {
// 建立目录
(());
// 进入并设置为当前目录
(());
}
}
(createpath);
return true;
} catch (SftpException e) {
();
}
return false;
}
/**
* 判断目录是否存在
*
* @param directory
* @return
*/
public boolean isDirExist(String directory, ChannelSftp sftp) {
boolean isDirExistFlag = false;
while (true) {
try {
SftpATTRS sftpATTRS = (directory);
isDirExistFlag = true;
return ();
} catch (Exception e) {
if (().toLowerCase().equals("no such file")||().toLowerCase().equals("failure")) {
return isDirExistFlag = false;
} else {
try {
();
(5000);
sftp = connect(sshSession());
} catch (Exception e1) {
// TODO Auto-generated catch block
();
}
}
}
}
}
/**
* 删除stfp文件
*
* @param directory
* :要删除文件所在目录
* @param deleteFile
* :要删除的文件
* @param sftp
*/
public void deleteSFTP(String directory, String deleteFile, ChannelSftp sftp) {
try {
// (directory);
(directory + deleteFile);
} catch (Exception e) {
();
}
}
/**
* 如果目录不存在就创建目录
*
* @param path
*/
public void mkdirs(String path) {
File f = new File(path);
String fs = ();
f = new File(fs);
if (!()) {
();
}
}
// 需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。
public static void deleteFolder(File folder) throws Exception {
if (!()) {
throw new Exception("文件不存在");
}
File[] files = ();
if (files != null) {
for (File file : files) {
if (()) {
// 递归直到目录下没有文件
deleteFolder(file);
} else {
// 删除
();
}
}
}
// 删除
();
}
/**
* 列出目录下的文件
*
* @param directory
* :要列出的目录
* @param sftp
* @return
* @throws SftpException
*/
public Vector listFiles(String directory, ChannelSftp sftp) {
Vector v = new Vector();
while (true) {
try {
if (isDirExist(directory, sftp)) {
v = (directory);
}
return v;
} catch (SftpException e) {
// TODO Auto-generated catch block
try {
(5000);
sftp = connect(sshSession());
} catch (Exception e1) {
// TODO Auto-generated catch block
();
}
();
}
}
}
public String getHost() {
return host;
}
public void setHost(String host) {
= host;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
= username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
= password;
}
public int getPort() {
return port;
}
public void setPort(int port) {
= port;
}
/**
* @Description:远程解压缩指定目录下的指定名字的文件
*
* @param fileName
* :需要解压的文件名字
*
* @param decpath
* :解压完成后的存放路径
*/
public void remoteZipToFile(String fileName, String decpath,
Session sshSession) {
("开始解压");
runCmd("/data/rizhi/unzip-5.52/unzip -o " + fileName + " -d /"
+ decpath + "/", sshSession);
("解压成功");
}
/**
* @Description:远程删除目录
*
* @param decpath
* :删除目录及以下文件
*/
public void rm(String decpath, Session sshSession) {
("开始删除" + decpath);
// ("rm -rf " + decpath);// 解压zip格式
runCmd("rm -rf " + decpath, sshSession);
("删除" + decpath + "成功");
}
/**
* 远程删除目录下后缀名为某个的文件
*
* @param remotPath
* :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
* @param indexOfFileName
* :某一天的文件夹(yyyyMMdd)
* @param indexOfFileNameXiaJi
* :某一天的文件夹下级文件夹res或者req或者什么文件夹名
* @param houZ*g
* :文件后缀名(BAL)
* @param sshSession
* :
* @return filenames :文件名称以及文件流 (Map<String, InputStream>)
*/
public void remoteZipToFileHouZhui(String remotePath,
String indexOfFileName, String indexOfFileNameXiaJi,
String houZ*g, Session sshSession) {
("开始删除" + remotePath + indexOfFileName + "/"
+ indexOfFileNameXiaJi + " 目录下" + houZ*g + "文件 ");
runCmd("find " + remotePath + indexOfFileName + "/"
+ indexOfFileNameXiaJi + " -name \"*." + houZ*g
+ "\" | xargs rm", sshSession);
("结束删除" + remotePath + indexOfFileName + "/"
+ indexOfFileNameXiaJi + " 目录下" + houZ*g + "文件,删除成功 ");
}
/**
* 远程获取目录下后缀名为某几类类型的文件
*
* @param remotPath
* :远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)
* @param indexOfFileName
* :某一天的文件夹(yyyyMMdd)
* @param indexOfFileNameXiaJi
* :某一天的文件夹下级文件夹res或者req或者什么文件夹名
* @param houZ*g
* :文件后缀名HIS\|CUR\
* @param sshSession
* :
* @return fileSize :文件个数
*/
public Integer getHouZ*gFileSum(String remotePath,
String indexOfFileName, String indexOfFileNameXiaJi,
String houZ*g, Session sshSession) {
("开始获取" + remotePath + indexOfFileName + "/"
+ indexOfFileNameXiaJi + " 目录下CUR,HIS文件个数 ");
String fileSize = runCmd("find " + remotePath + indexOfFileName + "/"
+ indexOfFileNameXiaJi + " -type f -regex \".*\\.\\("
+ houZ*g + ")\"| wc -l", sshSession);
("结束获取" + remotePath + indexOfFileName + "/"
+ indexOfFileNameXiaJi + " 目录下CUR,HIS文件,个数为: " + fileSize);
return (());
}
/**
* 执行linux代码; :
*
* @return filenames :文件名称以及文件流 (Map<String, InputStream>)
*/
public String runCmd(String cmd, Session sshSession) {
ChannelExec channelExec = null;
InputStream in = null;
while (true) {
try {
channelExec = (ChannelExec) ("exec");
in = ();
(cmd);
();
String s = (in, "UTF-8");
("结果:" + s);
();
return s;
} catch (IOException e) {
// TODO Auto-generated catch block
();
return null;
} catch (JSchException e) {
sshSession = sshSession();
// TODO Auto-generated catch block
();
}
}
}
/**
* 获取文件大小 :
*
* @return filenames :文件名称以及文件流 (Map<String, InputStream>)
*/
public long getFileSize(String srcSftpFilePath, ChannelSftp sftp) {
while (true) {
try {
SftpATTRS sftpATTRS = (srcSftpFilePath);
long filesize = ();
return filesize;
} catch (Exception e) {
// TODO Auto-generated catch block
();
sftp = connect(sshSession());
}
}
}
}