您好,登錄后才能下訂單哦!
本文實例為大家分享了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); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。