All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hb0730.commons.ssh.jsch.JschChannelSftp Maven / Gradle / Ivy

The newest version!
package com.hb0730.commons.ssh.jsch;

import com.hb0730.commons.lang.StringUtils;
import com.hb0730.commons.lang.constants.PathConst;
import com.hb0730.commons.lang.constants.PunctuationConst;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;

/**
 * JSch {@link com.jcraft.jsch.ChannelSftp}相关操作
 *
 * @author bing_huang
 * @see API
 * @since 2.1.2
 */
public class JschChannelSftp {
    private final ChannelSftp sftp;

    /**
     * 有参构造,自动链接{@link ChannelSftp#connect()}
* 1. {@link Session}不为空
* 2. {@link Session}已链接
* * @param session {@link Session} * @throws JschRuntimeException session为空或者链接关闭 * @see JschChannel#openSftp() */ public JschChannelSftp(Session session) { if (null == session) { throw new JschRuntimeException("JSch session is null"); } if (!session.isConnected()) { throw new JschRuntimeException("JSch session is Close null"); } sftp = JschChannel.builder(session).openSftp(); try { sftp.connect(); } catch (JSchException e) { throw new JschRuntimeException(e); } } /** * 创建{@link JschChannelSftp} * * @param session {@link Session} * @return {@link JschChannelSftp} */ public static JschChannelSftp builder(Session session) { return new JschChannelSftp(session); } /** * 获取当前{@link Session}的{@link ChannelSftp} * * @return {@link ChannelSftp} */ public ChannelSftp channelSftp() { return sftp; } /** * 更改当前的远程目录 * * @param path 目录 */ public void cd(String path) { try { sftp.cd(path); } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 以绝对形式返回当前的远程目录。 * * @return 当前远程目录 */ public String pwd() { try { return sftp.pwd(); } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 创建一个新的远程目录 * * @param path path */ public void mkdir(String path) { try { sftp.mkdir(path); } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 创建远程目录 * * @param path 目录,如果不存在则创建 */ public void mkdirExt(final String path) { final String[] paths = path.split(PathConst.ROOT_PATH); if (paths.length <= 0) { return; } StringJoiner joiner = new StringJoiner(PathConst.ROOT_PATH); for (String dir : paths) { if (StringUtils.isBlank(dir)) { joiner.add(PunctuationConst.EMPTY); continue; } joiner.add(dir); String newPath = joiner.toString(); try { cd(newPath); } catch (JschRuntimeException e) { mkdir(newPath); } } } /** * 删除一个或几个文件。 * * @param path 路径 */ public void rm(String path) { try { sftp.rm(path); } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 删除一个或几个远程目录, 不太理想,不太建议使用 * * @param path 目录 */ public void rmdir(String path) { try { sftp.rmdir(path); } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 重命名文件或目录 * * @param oldPath 旧路径 * @param newPath 新路径 */ public void rename(String oldPath, String newPath) { try { sftp.rename(oldPath, newPath); } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 更改一个或几个远程文件的权限。 * * @param permissions 权限 * @param path 文件路径 */ public void chmod(int permissions, String path) { try { sftp.chmod(permissions, path); } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 列出远程目录的内容。 * * @param path 路径 * @return 文件内容 */ public List ls(String path) { final List rptFiles = new LinkedList<>(); ChannelSftp.LsEntrySelector selector = entry -> { rptFiles.add(entry); return ChannelSftp.LsEntrySelector.CONTINUE; }; try { sftp.ls(path, selector); return rptFiles; } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 上传文件,覆盖模式 * * @param src 文件input流 * @param dst 上传的

全路径

,列如:/root/test.txt */ public void put(InputStream src, final String dst) { try { sftp.put(src, dst, ChannelSftp.OVERWRITE); } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 上传文件,覆盖式 * * @param src 文件input流 * @param path 上传的全路径,列如:/root/test.txt,如果不存在,自动创建 */ public void putExt(InputStream src, final String path) { final String dst = path.substring(0, path.lastIndexOf(PathConst.ROOT_PATH)); final String filename = path.substring(path.lastIndexOf(PathConst.ROOT_PATH)); putExt(src, dst, filename); } /** * 上传文件,覆盖式,上传路径为{@code dst+"/"+filename} * * @param src 文件input流 * @param dst 文件路径,不存在,默认自动创建 * @param filename 文件名称 */ public void putExt(InputStream src, final String dst, final String filename) { mkdirExt(dst); String newPath = dst + PathConst.ROOT_PATH + filename; put(src, newPath); } /** * 开始下载单个文件作为InputStream。 * * @param src 文件路径 * @return InputStream */ public InputStream get(String src) { try { return sftp.get(src); } catch (SftpException e) { throw new JschRuntimeException(e); } } /** * 下载当前文件夹下所有文件 * * @param dir 目录 * @return 文件名对应的输入流 */ public Map getForDir(String dir) { List dirList = ls(dir); List filePaths = new ArrayList<>(); for (ChannelSftp.LsEntry lsEntry : dirList) { SftpATTRS attrs = lsEntry.getAttrs(); if (!attrs.isDir()) { filePaths.add(lsEntry.getFilename()); } } Map fileMap = new HashMap<>(filePaths.size()); for (String filename : filePaths) { InputStream inputStream = get(dir + PathConst.ROOT_PATH + filename); fileMap.put(filename, inputStream); } return fileMap; } /** * 关闭{@link ChannelSftp}链接 * * @see ChannelSftp#disconnect() */ public void close() { JschUtils.close(sftp); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy