1. 概述

在本教程中,我们将讨论如何在Java中使用SFTP从远程服务器上传和下载文件。

我们将使用三个不同的库:JSchSSHJApache Commons VFS来实现。

2. 使用 JSch

首先,让我们看看如何使用JSch库从远程服务器上传和下载文件。

2.1. Maven 配置

我们需要将 jsch 依赖添加到我们的 pom.xml 中:

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version>
</dependency>

jsch 的最新版本可以在 [Maven Central](https://search.maven.org/search?q=g:com.jcraft AND a:jsch) 上找到。

2.2. 设置 JSch

现在我们将设置 JSch。

JSch 使我们能够使用密码验证或公钥验证来访问远程服务器。 在此示例中,我们将使用密码验证

private ChannelSftp setupJsch() throws JSchException {JSch jsch = new JSch();jsch.setKnownHosts("/Users/john/.ssh/known_hosts");Session jschSession = jsch.getSession(user_name, remote_Host);jschSession.setPassword(pass_word);jschSession.connect();return (ChannelSftp) jschSession.openChannel("sftp");
}

在上面的示例中,remoteHost 代表远程服务器的名称或 IP 地址(即 example.com)。 我们可以将测试中使用的变量定义为:

private String remote_Host = "HOST_NAME_HERE";
private String user_name = "USERNAME_HERE";
private String pass_word = "PASSWORD_HERE";

我们还可以使用以下命令生成 known_hosts 文件:

ssh-keyscan -H -t rsa REMOTE_HOSTNAME >> known_hosts

2.3. 使用 JSch 上传文件

要将文件上传到远程服务器,我们将使用方法 ChannelSftp.put():

@Test
public void whenUploadFileUsingJsch_thenSuccess() throws JSchException, SftpException {ChannelSftp channelSftp = setupJsch();channelSftp.connect();String localFile = "src/main/resources/sample.txt";String remoteDir = "remote_sftp_test/";channelSftp.put(localFile, remoteDir + "jschFile.txt");channelSftp.exit();
}

在这个例子中,方法的第一个参数代表要传输的本地文件,src/main/resources/sample.txt,而*remoteDir*是远程服务器上目标目录的路径。

2.4. 使用 JSch 下载文件

我们还可以使用 ChannelSftp.get() 从远程服务器下载文件:

@Test
public void whenDownloadFileUsingJsch_thenSuccess() throws JSchException, SftpException {ChannelSftp channelSftp = setupJsch();channelSftp.connect();String remoteFile = "welcome.txt";String localDir = "src/main/resources/";channelSftp.get(remoteFile, localDir + "jschFile.txt");channelSftp.exit();
}

其中remoteFile是要下载的文件的路径,localDir代表目标本地目录的路径。

3. 使用 SSHJ

接下来,我们将使用 SSHJ 库从远程服务器上传和下载文件。

3.1. Maven 配置

首先,我们将依赖添加到我们的 pom.xml 中:

<dependency><groupId>com.hierynomus</groupId><artifactId>sshj</artifactId><version>0.27.0</version>
</dependency>

最新的sshj版本可以在 [Maven Central](https://search.maven.org/search?q=g:com.hierynomus AND a:sshj) 上找到。

3.2. 设置 SSHJ

然后我们设置 SSHClient.

SSHJ 还允许我们使用密码或公钥认证来访问远程服务器。

我们将在示例中使用密码验证:

private SSHClient setupSshj() throws IOException {SSHClient client = new SSHClient();client.addHostKeyVerifier(new PromiscuousVerifier());client.connect(remoteHost);client.authPassword(username, password);return client;
}

3.3. 使用 SSHJ 上传文件

与 JSch 类似,我们将使用 SFTPClient.put() 方法将文件上传到远程服务器

@Test
public void whenUploadFileUsingSshj_thenSuccess() throws IOException {SSHClient sshClient = setupSshj();SFTPClient sftpClient = sshClient.newSFTPClient();sftpClient.put(localFile, remoteDir + "sshjFile.txt");sftpClient.close();sshClient.disconnect();
}

我们在这里定义了两个新变量:

private String localFile = "src/main/resources/input.txt";
private String remoteDir = "remote_sftp_test/";

3.4. 使用 SSHJ 下载文件

从远程服务器下载文件也是如此; 我们将使用 SFTPClient.get()

@Test
public void whenDownloadFileUsingSshj_thenSuccess() throws IOException {SSHClient sshClient = setupSshj();SFTPClient sftpClient = sshClient.newSFTPClient();sftpClient.get(remoteFile, localDir + "sshjFile.txt");sftpClient.close();sshClient.disconnect();
}

我们将添加上面使用的两个变量:

private String remoteFile = "welcome.txt";
private String localDir = "src/main/resources/";

4. 使用 Apache Commons VFS

最后,我们将使用 Apache Commons VFS 将文件传输到远程服务器。

实际上,Apache Commons VFS 内部使用 JSch 库

4.1. Maven 配置

我们需要将 commons-vfs2 依赖项添加到 pom.xml 中:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-vfs2</artifactId><version>2.4</version>
</dependency>

最新版本的 commons-vfs2 可以在 [Maven Central](https://search.maven.org/search?q=g:org.apache.commons AND a:commons-vfs2) 上找到。

4.2. 使用 Apache Commons VFS 上传文件

Apache Commons VFS 有点不同。

我们将使用 FileSystemManager 从我们的目标文件创建 FileObjects,然后使用 FileObjects 传输我们的文件。

在本例中,我们将使用 FileObject.copyFrom() 方法上传文件:

@Test
public void whenUploadFileUsingVfs_thenSuccess() throws IOException {FileSystemManager manager = VFS.getManager();FileObject local = manager.resolveFile(System.getProperty("user.dir") + "/" + localFile);FileObject remote = manager.resolveFile("sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt");remote.copyFrom(local, Selectors.SELECT_SELF);local.close();remote.close();
}

注意本地文件路径应该是绝对路径,远程文件路径应该以*sftp://username:password@remoteHost/*开头

4.3. 使用 Apache Commons VFS 下载文件

从远程服务器下载文件非常相似; 我们将使用 FileObject.copyFrom() 从 remoteFile 复制 localFile:

@Test
public void whenDownloadFileUsingVfs_thenSuccess() throws IOException {FileSystemManager manager = VFS.getManager();FileObject local = manager.resolveFile(System.getProperty("user.dir") + "/" + localDir + "vfsFile.txt");FileObject remote = manager.resolveFile("sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteFile);local.copyFrom(remote, Selectors.SELECT_SELF);local.close();remote.close();
}

5. 结束

在本文中,我们学习了如何使用 Java 从远程 SFTP 服务器上传和下载文件。 为此,我们使用了多个库:JSchSSHJApache Commons VFS

完整的源代码可以在 over on GitHub 中找到。

在Java中使用SFTP传输文件相关推荐

  1. 在Java中实现SFTP协议文件传输的两种解决方案

    在Java中实现SFTP协议文件传输的两种解决方案 1.1 背景 1.2 关于 FTP /FTPS 1.3 关于SFTP 解决方案一:使用 JSch 库 解决方案二:使用sshj 库 这篇博文来聊聊在 ...

  2. SFTP传输文件工具FileZilla下载安装教程

    SFTP传输文件工具FileZilla下载安装教程 中文官网链接:https://www.filezilla.cn/download/client windows平台可下载标红的,也可以下载绿色版 下 ...

  3. 内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败

    内存映射文件 写入 卡住 内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入 ...

  4. 在Java中使用内存映射文件时检测(写入)失败

    内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入缓存(您不必自己编写,并且 ...

  5. Java中如何创建一个文件或者文件夹

    Java中如何创建一个文件或者文件夹 创建一个文件夹: 调用Java中File类中的mkdir( )或者mkdirs( )方法 boolean  makdir( ):创建一个文件夹,创建成功返回tru ...

  6. java 文件路径读取,java中依据路径读取文件

    java中根据路径读取文件 根据文件路径读取文件.具体代码如下: /** * 根据文件路径读取文件 * @param path * @return String * @throws IOExcepti ...

  7. java中找不到文件是什么情况_java系统找不到指定文件怎么办

    系统找不到指定文件解决方法如下:目录路径太长,这个文件找不到,是因为目录路径太长,windows识别不了这么长的目录,首先,这个目录上级目录已经是windows的.2.检查文件路径是否正确 3.另外, ...

  8. 在java中使用SFTP协议安全的传输文件

    本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输.我们先来了解一下这几个协议 SSH 是较可靠,专为远程登录会话和其他 ...

  9. channelsftp的put_JSch - Java实现的SFTP(文件上传详解篇)

    public void put(String src, String dst) 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同. 采用 ...

最新文章

  1. 机器人控制与感知有感
  2. getconnectiontimeoutexception 网络问题排查_通俗解析居家宽带网络问题:光猫设备排查教程篇...
  3. 专车降价滴滴快车使命终结?
  4. 注意力机制~Attention Mechanism
  5. zookeeper curator 服务注册
  6. Android Studio的Gradle常用命令配置和依赖管理
  7. [转]Create Custom Exception Filter in ASP.NET Core
  8. 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一)
  9. html5与跨平台开发,HTML5应用与跨平台应用开发
  10. bootstrap html5 表单验证,基于Bootstrap+jQuery.validate实现表单验证
  11. oreo另一个意思_记一次有意思的统计(部分大宗商品价格指数相关性统计)
  12. RFT属于软件测试管理工具,IBM Rational FunctionalTester RFT 软件功能测试工具_FunctionalTester_领测软件测试网...
  13. 2020最新直播源地址下载txt_TXT追书免费小说app安卓版下载-TXT追书免费小说最新版下载v5.0.0...
  14. linux脚本base64加密当时,【加密算法】Base64
  15. APP自动化测试系列之3种元素定位工具
  16. verilog 生成块_Verilog数字系统设计教程之学习摘要
  17. AIX PV VG LV详解
  18. 不创建临时变量,交换两整数的值
  19. JDK8环境配置教程
  20. Nodejs框架+uniapp前端微商个人相册多端小程序

热门文章

  1. 详解Linux(基础篇)
  2. XML外部实体注入(XXE)的原理和应用
  3. 关于在下名字问题的研究报告
  4. 给你的电脑降降温!!!!!!
  5. 使用Delphi编写自动关闭Windows信使服务窗体程序
  6. WSL2中设置DNS后重启终端又失效的解决方法
  7. Minifilter 拦截FileMapping IO事件
  8. 阿里资深架构师:初识混沌工程(上)
  9. (黑马程序员)MongoDB + Express + art-template 项目实例-博客管理系统 第一页
  10. Python代码转如何换为exe可执行程序详解