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

使用 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();
}
}
}
}
注意事项
- 安全性:在生产环境中,避免在代码中硬编码用户名和密码,考虑使用配置文件或环境变量。
- 错误处理:添加适当的错误处理逻辑,特别是网络问题和文件不存在的情况。
- 性能:对于大文件下载,考虑使用缓冲流或分块下载。
- 超时设置:可以设置连接和读取超时:
ftpClient.setDefaultTimeout(10000); // 10秒 ftpClient.setConnectTimeout(10000); // 10秒 ftpClient.setDataTimeout(30000); // 30秒
- 代理支持:如果需要通过代理连接,可以使用
FTPClient的setProxy方法。
方法提供了从 FTP 服务器下载文件的基本实现,你可以根据具体需求进行调整和扩展。


