通常需要從linux服務器獲取數據文件,而通常能有的訪問方式只有ssh,所以就可以用ssh進行數據下載。
java連接遠程主機的方式有多種,這里和大家分享的是通過ssh方式連接遠程主機,使用的是jsch這個jar包,資源在這里。
package com.app.pt.backup.util; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.app.common.util.FileUtil; 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.SftpException; /** * SFTP幫助類 * @author wangbailin * */ public class SFTPUtil { private static Log log = LogFactory.getLog(SFTPUtil.class); /** * 連接sftp服務器 * @param host 遠程主機ip地址 * @param port sftp連接端口,null 時為默認端口 * @param user 用戶名 * @param password 密碼 * @return * @throws JSchException */ public static Session connect(String host, Integer port, String user, String password) throws JSchException{ Session session = null; try { JSch jsch = new JSch(); if(port != null){ session = jsch.getSession(user, host, port.intValue()); }else{ session = jsch.getSession(user, host); } session.setPassword(password); //設置第一次登陸的時候提示,可選值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); //30秒連接超時 session.connect(30000); } catch (JSchException e) { e.printStackTrace(); System.out.println("SFTPUitl 獲取連接發生錯誤"); throw e; } return session; } /** * sftp上傳文件(夾) * @param directory * @param uploadFile * @param sftp * @throws Exception */ public static void upload(String directory, String uploadFile, ChannelSftp sftp) throws Exception{ System.out.println("sftp upload file [directory] : "+directory); System.out.println("sftp upload file [uploadFile] : "+ uploadFile); File file = new File(uploadFile); if(file.exists()){ //這里有點投機取巧,因為ChannelSftp無法去判讀遠程linux主機的文件路徑,無奈之舉 try { Vector content = sftp.ls(directory); if(content == null){ sftp.mkdir(directory); } } catch (SftpException e) { sftp.mkdir(directory); } //進入目標路徑 sftp.cd(directory); if(file.isFile()){ InputStream ins = new FileInputStream(file); //中文名稱的 sftp.put(ins, new String(file.getName().getBytes(),"UTF-8")); //sftp.setFilenameEncoding("UTF-8"); }else{ File[] files = file.listFiles(); for (File file2 : files) { String dir = file2.getAbsolutePath(); if(file2.isDirectory()){ String str = dir.substring(dir.lastIndexOf(file2.separator)); directory = FileUtil.normalize(directory + str); } upload(directory,dir,sftp); } } } } /** * sftp下載文件(夾) * @param directory 下載文件上級目錄 * @param srcFile 下載文件完全路徑 * @param saveFile 保存文件路徑 * @param sftp ChannelSftp * @throws UnsupportedEncodingException */ public static void download(String directory,String srcFile, String saveFile, ChannelSftp sftp) throws UnsupportedEncodingException { Vector conts = null; try{ conts = sftp.ls(srcFile); } catch (SftpException e) { e.printStackTrace(); log.debug("ChannelSftp sftp羅列文件發生錯誤",e); } File file = new File(saveFile); if(!file.exists()) file.mkdir(); //文件 if(srcFile.indexOf(".") > -1){ try { sftp.get(srcFile, saveFile); } catch (SftpException e) { e.printStackTrace(); log.debug("ChannelSftp sftp下載文件發生錯誤",e); } }else{ //文件夾(路徑) for (Iterator iterator = conts.iterator(); iterator.hasNext();) { LsEntry obj = (LsEntry) iterator.next(); String filename = new String(obj.getFilename().getBytes(),"UTF-8"); if(!(filename.indexOf(".") > -1)){ directory = FileUtil.normalize(directory + System.getProperty("file.separator") + filename); srcFile = directory; saveFile = FileUtil.normalize(saveFile + System.getProperty("file.separator") + filename); }else{ //掃描到文件名為".."這樣的直接跳過 String[] arrs = filename.split("\\."); if((arrs.length > 0) && (arrs[0].length() > 0)){ srcFile = FileUtil.normalize(directory + System.getProperty("file.separator") + filename); }else{ continue; } } download(directory, srcFile, saveFile, sftp); } } } }
調用方法:
ChannelSftp sftp = null; Session session = null; try { session = SFTPUtil.connect(host, port, username, password); Channel channel = session.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; SFTPUtil.upload(destDir, srcfile.getAbsolutePath(), sftp); } catch (Exception e) { e.printStackTrace(); logger.debug(e); return UtilMisc.toMap("flag","failure","msg","備份文件到遠程主機發生錯誤"); }finally{ if(sftp != null)sftp.disconnect(); if(session != null)session.disconnect(); }
原文博客地址:http://blog.csdn.net/wangbailin2009/article/details/20232999#L51