凌峰创科服务平台

Java FTP如何下载服务器文件?

Java FTP 下载服务器文件指南

在 Java 中,你可以使用多种方式通过 FTP 协议从服务器下载文件,以下是几种常见的方法:

Java FTP如何下载服务器文件?-图1
(图片来源网络,侵删)

使用 Apache Commons Net 库(推荐)

Apache Commons Net 是最常用的 Java FTP 客户端库。

添加依赖(Maven)

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.9.0</version>
</dependency>

示例代码

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.FileOutputStream;
import java.io.IOException;
public class FtpDownloadExample {
    public static void main(String[] args) {
        String server = "ftp.example.com";
        int port = 21;
        String user = "username";
        String pass = "password";
        String remoteFilePath = "/remote/path/to/file.txt";
        String localFilePath = "local_file.txt";
        FTPClient ftpClient = new FTPClient();
        try {
            // 连接FTP服务器
            ftpClient.connect(server, port);
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                System.out.println("FTP服务器连接失败");
                return;
            }
            // 登录
            boolean login = ftpClient.login(user, pass);
            if (!login) {
                System.out.println("FTP登录失败");
                return;
            }
            // 设置文件传输模式为二进制
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            // 进入被动模式(可选,但推荐)
            ftpClient.enterLocalPassiveMode();
            // 下载文件
            try (FileOutputStream outputStream = new FileOutputStream(localFilePath)) {
                boolean success = ftpClient.retrieveFile(remoteFilePath, outputStream);
                if (success) {
                    System.out.println("文件下载成功: " + localFilePath);
                } else {
                    System.out.println("文件下载失败");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

使用 Java 7+ 的 NIO.2 FTP 客户端

Java 7 引入了 NIO.2,但标准库中没有直接支持 FTP,你可以使用第三方库如 FTPClient 的 NIO 版本。

使用 JSch(对于 SFTP)

如果服务器支持 SFTP(SSH 文件传输协议),可以使用 JSch 库:

import com.jcraft.jsch.*;
public class SftpDownloadExample {
    public static void main(String[] args) {
        String host = "sftp.example.com";
        int port = 22;
        String user = "username";
        String password = "password";
        String remoteFilePath = "/remote/path/to/file.txt";
        String localFilePath = "local_file.txt";
        Session session = null;
        Channel channel = null;
        ChannelSftp channelSftp = null;
        try {
            JSch jsch = new JSch();
            session = jsch.getSession(user, host, port);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();
            channel = session.openChannel("sftp");
            channel.connect();
            channelSftp = (ChannelSftp) channel;
            channelSftp.get(remoteFilePath, localFilePath);
            System.out.println("文件下载成功: " + localFilePath);
        } catch (JSchException | SftpException e) {
            e.printStackTrace();
        } finally {
            if (channelSftp != null) {
                channelSftp.disconnect();
            }
            if (channel != null) {
                channel.disconnect();
            }
            if (session != null) {
                session.disconnect();
            }
        }
    }
}

注意事项

  1. 安全性:在生产环境中,避免在代码中硬编码用户名和密码,考虑使用配置文件或环境变量。
  2. 错误处理:添加适当的错误处理逻辑,特别是网络问题和文件不存在的情况。
  3. 性能:对于大文件下载,考虑使用缓冲流或分块下载。
  4. 超时设置:可以设置连接和读取超时:
    ftpClient.setDefaultTimeout(10000); // 10秒
    ftpClient.setConnectTimeout(10000); // 10秒
    ftpClient.setDataTimeout(30000);    // 30秒
  5. 代理支持:如果需要通过代理连接,可以使用 FTPClientsetProxy 方法。

方法提供了从 FTP 服务器下载文件的基本实现,你可以根据具体需求进行调整和扩展。

Java FTP如何下载服务器文件?-图2
(图片来源网络,侵删)
Java FTP如何下载服务器文件?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇