使用 Java 通过 SFTP 下载整个文件夹

在现代的应用程序中,文件传输是一个非常常见的操作。如果你需要从远程服务器下载整个文件夹,使用 SFTP(SSH 文件传输协议)确实是一个理想的选择。Java 提供了很多库来实现这一点,本文将介绍如何使用 JSch 库进行 SFTP 操作,并给出具体的代码示例。

1. JSch 库简介

JSch 是一个纯 Java 实现的 SSH2 客户端,它可以让你轻松地使用 SFTP 协议进行文件操作。通过 JSch,你可以很方便地连接到 SSH 服务器,然后进行文件的上传和下载等操作。

2. 环境准备

在开始之前,确保你的项目中已引入 JSch 库。你可以通过 Maven 引入:

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

3. SFTP 下载整个文件夹的代码示例

下面是一个 SFTP 下载整个文件夹的 Java 实现示例:

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Vector;

public class SftpDownload {

    private String host;
    private String user;
    private String password;
    
    public SftpDownload(String host, String user, String password) {
        this.host = host;
        this.user = user;
        this.password = password;
    }

    public void downloadFolder(String remoteDir, String localDir) throws Exception {
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, 22);
        session.setPassword(password);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();
        
        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();

        // 检查本地目录是否存在,若不存在,则创建
        File localDirFile = new File(localDir);
        if (!localDirFile.exists()) {
            localDirFile.mkdirs();
        }

        // 下载文件夹内容
        downloadDirectory(remoteDir, localDir, channelSftp);

        channelSftp.exit();
        session.disconnect();
    }

    private void downloadDirectory(String remoteDir, String localDir, ChannelSftp channelSftp) throws Exception {
        Vector<ChannelSftp.LsEntry> fileList = channelSftp.ls(remoteDir);
        for (ChannelSftp.LsEntry entry : fileList) {
            String fileName = entry.getFilename();
            String remoteFilePath = remoteDir + "/" + fileName;
            String localFilePath = localDir + "/" + fileName;

            if (entry.getAttrs().isDir()) {
                // 是目录,递归下载
                new File(localFilePath).mkdirs();
                downloadDirectory(remoteFilePath, localFilePath, channelSftp);
            } else {
                // 是文件,下载
                try (InputStream inputStream = channelSftp.get(remoteFilePath);
                     FileOutputStream outputStream = new FileOutputStream(localFilePath)) {
                    byte[] buffer = new byte[1024];
                    int bytesRead;
                    while ((bytesRead = inputStream.read(buffer)) != -1) {
                        outputStream.write(buffer, 0, bytesRead);
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        try {
            SftpDownload sftpDownload = new SftpDownload("your.sftp.server", "username", "password");
            sftpDownload.downloadFolder("/remote/path/to/folder", "/local/path/to/folder");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 代码解析

以上代码中,我们实现了一个简单的 SFTP 客户端,能够递归地下载指定远程目录的内容。主要步骤包括:

  • 连接到 SFTP 服务器:通过 JSch 创建 SessionChannelSftp
  • 创建本地目录:如果本地目录不存在,则创建。
  • 列表远程目录内容:使用 channelSftp.ls() 方法列出远程目录的内容。
  • 递归下载:如果遇到子目录,递归调用 downloadDirectory 方法;如果遇到文件,则下载文件。

5. 类图

以下是上述代码的类图,帮助理解代码中的类及其关系。

classDiagram
    class SftpDownload {
        +String host
        +String user
        +String password
        +downloadFolder(remoteDir: String, localDir: String)
        +downloadDirectory(remoteDir: String, localDir: String, channelSftp: ChannelSftp)
    }

6. 总结

以上就是使用 Java 通过 SFTP 下载整个文件夹的完整示例。通过 JSch 库,我们能够非常方便地进行 SFTP 操作。无论是单个文件还是整个文件夹的下载,这种方式都非常高效和简单。

在实际运用中,你可以根据需要对异常处理进行扩展,可以添加更多的功能,如文件校验、进度显示等。希望本文能对你使用 Java 进行 SFTP 文件传输有所帮助!