java使用JSCH實現SFTP文件管理

這篇文章主要爲大家詳細介紹了java使用JSCH實現SFTP文件管理,實現上傳、下載等功能,具有一定的參考價值,感興趣的小夥伴們可以參考一下

本文實例爲大家分享了java使用JSCH實現SFTP文件管理的具體代碼,供大家參考,具體內容如下

一、連接配置

1.在項目中導入jsch-0.1.51.jar包;

2.創建SFTP類,存放連接屬性,其中要注意一點,在進行FTP操作時,一個會話在建立連接通道後進入A目錄進行文件操作,不能直接跳到同級或上級目錄操作,需要先退出當前會話或者新建會話。

public class SFTP{

 private Session session;//會話 
 private Channel channel;//連接通道 
 private ChannelSftp sftp;// sftp操作類 


 public Session getSession() {
 return session;
 }
 public void setSession(Session session) {
 this.session = session;
 }
 public Channel getChannel() {
 return channel;
 }
 public void setChannel(Channel channel) {
 this.channel = channel;
 }
 public ChannelSftp getSftp() {
 return sftp;
 }
 public void setSftp(ChannelSftp sftp) {
 this.sftp = sftp;
 }


}

3.創建SFTPUtil類,創建連接配置方法

 /**
 * 連接ftp/sftp服務器
 * @param SFTP類
 */
 public static void getConnect(SFTP s) throws Exception {

 /** 密鑰的密碼 */ 
// String privateKey ="key";
// /** 密鑰文件路徑 */ 
// String passphrase ="path";
 /** 主機 */ 
 String host ="127.0.0.1"; 
 /** 端口 */ 
 int port =22; 
 /** 用戶名 */ 
 String username ="test";
 /** 密碼 */ 
 String password ="test";

 Session session = null; 
 Channel channel = null; 
 ChannelSftp sftp = null;// sftp操作類 

 JSch jsch = new JSch(); 


 //設置密鑰和密碼 
 //支持密鑰的方式登陸,只需在jsch.getSession之前設置一下密鑰的相關信息就可以了 
// if (privateKey != null && !"".equals(privateKey)) { 
// if (passphrase != null && "".equals(passphrase)) { 
// //設置帶口令的密鑰 
//  jsch.addIdentity(privateKey, passphrase); 
// } else { 
// //設置不帶口令的密鑰 
//  jsch.addIdentity(privateKey); 
// } 
// } 
 session = jsch.getSession(username, host, port); 
 session.setPassword(password); 
 Properties config = new Properties(); 
 config.put("StrictHostKeyChecking", "no"); // 不驗證 HostKey 
 session.setConfig(config); 
 try {
 session.connect(); 
 } catch (Exception e) {
 if (session.isConnected()) 
 session.disconnect(); 
 log.error("連接服務器失敗,請檢查主機[" + host + "],端口[" + port 
  + "],用戶名[" + username + "],端口[" + port 
  + "]是否正確,以上信息正確的情況下請檢查網絡連接是否正常或者請求被防火牆拒絕."); 
 }
 channel = session.openChannel("sftp"); 
 try {
 channel.connect(); 
 } catch (Exception e) { 
 if (channel.isConnected()) 
 channel.disconnect(); 
 log.error("連接服務器失敗,請檢查主機[" + host + "],端口[" + port 
  + "],用戶名[" + username + "],密碼是否正確,以上信息正確的情況下請檢查網絡連接是否正常或者請求被防火牆拒絕."); 
 }
 sftp = (ChannelSftp) channel; 

 s.setChannel(channel);
 s.setSession(session);
 s.setSftp(sftp);

 }

5.關閉連接方法

 /**
 * 斷開連接
 * 
 */
 public static void disConn(Session session,Channel channel,ChannelSftp sftp)throws Exception{
 if(null != sftp){
 sftp.disconnect();
 sftp.exit();
 sftp = null;
 }
 if(null != channel){
 channel.disconnect();
 channel = null;
 }
 if(null != session){
 session.disconnect();
 session = null;
 }
 }

二、SFTP目錄、文件操作管理

1.上傳文件

 /**
 * 上傳文件
 * @param directory 上傳的目錄-相對於SFPT設置的用戶訪問目錄,
 * 爲空則在SFTP設置的根目錄進行創建文件(除設置了服務器全磁盤訪問)
 * @param uploadFile 要上傳的文件全路徑
 */
 public static void upload(String directory,String uploadFile) throws Exception {

 SFTP s=new SFTP();
 getConnect(s);//建立連接
 Session session = s.getSession(); 
 Channel channel = s.getChannel(); 
 ChannelSftp sftp = s.getSftp();// sftp操作類 
 try {
 try{
  sftp.cd(directory); //進入目錄
 }catch(SftpException sException){
  if(sftp.SSH_FX_NO_SUCH_FILE == sException.id){ //指定上傳路徑不存在
  sftp.mkdir(directory);//創建目錄
  sftp.cd(directory); //進入目錄
  }
 }


 }
 File file = new File(uploadFile);
 InputStream in= new FileInputStream(file);
 sftp.put(in, file.getName());
 in.close();

 } catch (Exception e) {
 throw new Exception(e.getMessage(),e); 
 } finally {
 disConn(session,channel,sftp);
 }
 }

2.文件下載

/**
 * 下載文件
 * @param directory 下載目錄 根據SFTP設置的根目錄來進行傳入
 * @param downloadFile 下載的文件 
 * @param saveFile 存在本地的路徑 
 */
 public static void download(String directory, String downloadFile,String saveFile) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立連接
 Session session = s.getSession(); 
 Channel channel = s.getChannel(); 
 ChannelSftp sftp = s.getSftp();// sftp操作類 
 try {

 sftp.cd(directory); //進入目錄
 File file = new File(saveFile);
 boolean bFile;
 bFile = false;
 bFile = file.exists();
 if (!bFile) {
 bFile = file.mkdirs();//創建目錄
 }
 OutputStream out=new FileOutputStream(new File(saveFile,downloadFile));

 sftp.get(downloadFile, out);

 out.flush();
 out.close();

 } catch (Exception e) {
 throw new Exception(e.getMessage(),e); 
 } finally {
 disConn(session,channel,sftp);
 }
 }

3.刪除文件

/**
 * 刪除文件
 * @param directory 要刪除文件所在目錄 
 * @param deleteFile 要刪除的文件
 */
 public static void delete(String directory, String deleteFile) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立連接
 Session session = s.getSession(); 
 Channel channel = s.getChannel(); 
 ChannelSftp sftp = s.getSftp();// sftp操作類 
 try {
 sftp.cd(directory); //進入的目錄應該是要刪除的目錄的上一級
 sftp.rm(deleteFile);//刪除目錄
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e); 
 } finally {
 disConn(session,channel,sftp);
 }
 }

4.列出目錄下的文件

/** 
 * 列出目錄下的文件 
 * @param directory 要列出的目錄 
 * @return list 文件名列表 
 * @throws Exception 
 */ 
 public static List<String> listFiles(String directory) throws Exception { 
 SFTP s=new SFTP();
 getConnect(s);//建立連接
 Session session = s.getSession(); 
 Channel channel = s.getChannel(); 
 ChannelSftp sftp = s.getSftp();// sftp操作類 
 Vector fileList=null; 
 List<String> fileNameList = new ArrayList<String>(); 
 fileList = sftp.ls(directory); //返回目錄下所有文件名稱
 disConn(session,channel,sftp);

 Iterator it = fileList.iterator(); 

 while(it.hasNext()) { 

 String fileName = ((LsEntry)it.next()).getFilename(); 
 if(".".equals(fileName) || "..".equals(fileName)){ 
 continue; 
 } 
 fileNameList.add(fileName); 

 } 

 return fileNameList; 
 } 

5.刪除目錄下所有文件

/**
 * 刪除目錄下所有文件
 * @param directory 要刪除文件所在目錄 
 */
 public static void deleteAllFile(String directory) throws Exception{
 SFTP s=new SFTP();
 getConnect(s);//建立連接
 Session session = s.getSession(); 
 Channel channel = s.getChannel(); 
 ChannelSftp sftp = s.getSftp();// sftp操作類 
 try {
 List <String> files=listFiles(directory);//返回目錄下所有文件名稱
 sftp.cd(directory); //進入目錄

 for (String deleteFile : files) {
 sftp.rm(deleteFile);//循環一次刪除目錄下的文件
 }
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e); 
 } finally {
 disConn(session,channel,sftp);
 }

 }

6.刪除目錄 (刪除的目錄必須爲空)

/**
 * 刪除目錄 (刪除的目錄必須爲空)
 * @param deleteDir 要刪除的目錄 
 */
 public static void deleteDir(String deleteDir) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立連接
 Session session = s.getSession(); 
 Channel channel = s.getChannel(); 
 ChannelSftp sftp = s.getSftp();// sftp操作類 
 try {

 sftp.rmdir(deleteDir);

 } catch (Exception e) {
 throw new Exception(e.getMessage(),e); 
 } finally {
 disConn(session,channel,sftp);
 }
 }

7.創建目錄

 /**
 * 創建目錄 
 * @param directory 要創建的目錄 位置
 * @param dir 要創建的目錄 
 */
 public static void creatDir(String directory,String dir) throws Exception {
 SFTP s=new SFTP();
 getConnect(s);//建立連接
 Session session = s.getSession(); 
 Channel channel = s.getChannel(); 
 ChannelSftp sftp = s.getSftp();// sftp操作類 
 try {
 sftp.cd(directory); 
 sftp.mkdir(dir);
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e); 
 } finally {
 disConn(session,channel,sftp);
 }
 }

8.更改文件名

/** 
 * 更改文件名 
 * @param directory 文件所在目錄 
 * @param oldFileNm 原文件名 
 * @param newFileNm 新文件名 
 * @throws Exception 
 */ 
 public static void rename(String directory, String oldFileNm, String newFileNm) throws Exception { 
 SFTP s=new SFTP();
 getConnect(s);//建立連接
 Session session = s.getSession(); 
 Channel channel = s.getChannel(); 
 ChannelSftp sftp = s.getSftp();// sftp操作類 
 try {
 sftp.cd(directory); 
 sftp.rename(oldFileNm, newFileNm); 
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e); 
 } finally {
 disConn(session,channel,sftp);
 }
 } 

9.進入目錄

/**
 * 進入目錄
 * @param directory
 * @throws Exception
 */
 public static void cd(String directory)throws Exception { 

 SFTP s=new SFTP();
 getConnect(s);//建立連接
 Session session = s.getSession(); 
 Channel channel = s.getChannel(); 
 ChannelSftp sftp = s.getSftp();// sftp操作類 
 try {
 sftp.cd(directory); //目錄要一級一級進
 } catch (Exception e) {
 throw new Exception(e.getMessage(),e); 
 } finally {
 disConn(session,channel,sftp);
 }
 } 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持神馬文庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章