sftp批量上传及批量下载等最全功能的工具类
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.SftpATTRS;
import com.jcraft.jsch.SftpException;
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.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SFTPUtils
{
private static final Logger log = LoggerFactory.getLogger(SFTPUtils.class);
private String host;
private String username;
private String password;
private int port = 22;
private ChannelSftp sftp = null;
private Session sshSession = null;
public SFTPUtils() {
}
public SFTPUtils(String host, String username, String password) {
this.host = host;
this.username = username;
this.password = password;
}
public SFTPUtils(String host, int port, String username, String password) {
this.host = host;
this.username = username;
this.password = password;
this.port = port;
}
public boolean connect()
{
try
{
JSch jsch = new JSch();
jsch.getSession(this.username, this.host, this.port);
this.sshSession = jsch.getSession(this.username, this.host, this.port);
if (log.isInfoEnabled()) {
log.info("Session created.");
}
this.sshSession.setPassword(this.password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
this.sshSession.setConfig(sshConfig);
this.sshSession.connect();
if (log.isInfoEnabled()) {
log.info("Session connected.");
}
Channel channel = this.sshSession.openChannel("sftp");
channel.connect();
if (log.isInfoEnabled()) {
log.info("Opening Channel.");
}
this.sftp = ((ChannelSftp)channel);
if (log.isInfoEnabled()) {
log.info("Connected to " + this.host + ".");
}
return true;
} catch (JSchException e) {
log.error(new Date() + "连接sftp出现异常如下:");
e.printStackTrace();
}return false;
}
public void disconnect()
{
if ((this.sftp != null) &&
(this.sftp.isConnected())) {
this.sftp.disconnect();
if (log.isInfoEnabled()) {
log.info("sftp is closed already");
}
}
if ((this.sshSession != null) &&
(this.sshSession.isConnected())) {
this.sshSession.disconnect();
if (log.isInfoEnabled())
log.info("sshSession is closed already");
}
}
public List batchDownLoadFile(String remotePath, String localPath, String fileFormat, String fileEndFormat, boolean del)
{
List filenames = new ArrayList();
if (connect()) {
try {
Vector v = listFiles(remotePath);
if (v.size() > 0) {
log.info("本次处理文件个数不为零,开始下载...fileSize=" + v.size());
Iterator it = v.iterator();
while (it.hasNext()) {
ChannelSftp.LsEntry entry = (ChannelSftp.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 {
}
return filenames;
}
return filenames;
}
public boolean downloadFile(String remotePath, String remoteFileName, String localPath, String localFileName)
{
FileOutputStream fieloutput = null;
try
{
File file = new File(localPath + localFileName);
fieloutput = new FileOutputStream(file);
this.sftp.get(remotePath + remoteFileName, fieloutput);
if (log.isInfoEnabled()) {
log.info("===DownloadFile:" + remoteFileName + " success from sftp.");
}
int i = 1;
return i;
} catch (FileNotFoundException e) {
e.printStackTrace();
if (null != fieloutput)
try {
fieloutput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
catch (SftpException e)
{
e.printStackTrace();
if (null != fieloutput)
try {
fieloutput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
finally
{
if (null != fieloutput) {
try {
fieloutput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
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);
this.sftp.put(in, remoteFileName);
int i = 1;
return i;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
public boolean bacthUploadFile(String remotePath, String localPath, String backupPath, boolean del)
{
if (connect()) {
File file = new File(localPath);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
File f = files[i];
if ((f.isFile()) && (f.getName().indexOf("bak") == -1)) {
String fileName = f.getName();
uploadFile(remotePath, fileName, localPath, fileName);
FileUtil.copyBackFile(f, fileName, backupPath);
if (del) {
f.delete();
}
}
}
disconnect();
return true;
}
return true;
}
public boolean deleteFile(String filePath)
{
File file = new File(filePath);
if (!file.exists()) {
return false;
}
if (!file.isFile()) {
return false;
}
return file.delete();
}
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())) {
this.sftp.cd(filePath.toString());
}
else {
this.sftp.mkdir(filePath.toString());
this.sftp.cd(filePath.toString());
}
}
this.sftp.cd(createpath);
return true;
} catch (SftpException e) {
e.printStackTrace();
}
return false;
}
public boolean isDirExist(String directory)
{
boolean isDirExistFlag = false;
try {
SftpATTRS sftpATTRS = this.sftp.lstat(directory);
isDirExistFlag = true;
return sftpATTRS.isDir();
} catch (Exception e) {
if (e.getMessage().toLowerCase().equals("no such file")) {
isDirExistFlag = false;
}
}
return isDirExistFlag;
}
public void deleteSFTP(String directory, String deleteFile)
{
try
{
this.sftp.rm(directory + deleteFile);
if (log.isInfoEnabled())
log.info("delete file success from sftp.");
}
catch (SftpException e) {
e.printStackTrace();
}
}
public void mkdirs(String path)
{
File f = new File(path);
String fs = f.getParent();
f = new File(fs);
if (!f.exists())
f.mkdirs();
}
public Vector> listFiles(String directory)
throws SftpException
{
return this.sftp.ls(directory);
}
public String getHost() {
return this.host;
}
public void setHost(String host) {
this.host = host;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public int getPort() {
return this.port;
}
public void setPort(int port) {
this.port = port;
}
public ChannelSftp getSftp() {
return this.sftp;
}
public void setSftp(ChannelSftp sftp) {
this.sftp = sftp;
}
}