目录
一、FTP是什么二、FTP的主要特点三、FTP应用场景四、FTP 与 HTTP 传输文件的区别五、 Java 如何分别实现用 FTP 和 HTTP 下载文件方式 1:使用 FTP 下载文件(推荐 Apache Commons Net)方式 2:使用 HTTP 下载文件(Java 内置类或 HttpClient)
六、对比总结(Java 实现角度)七、建议
一、FTP是什么
FTP 是“文件传输协议”(File Transfer Protocol)的英文缩写,是一种用于在计算机网络上进行文件传输的标准网络协议。简单来说,FTP 就是一种让你能在两台计算机之间(比如你的个人电脑和一台远程服务器)上传、下载和管理文件的规则或方法。
二、FTP的主要特点
客户端-服务器架构:
FTP 采用客户端/服务器模式。你使用的电脑是“客户端”,而存储文件的那台远程计算机是“服务器”。你需要使用 FTP 客户端软件(如 FileZilla、WinSCP 等)连接到 FTP 服务器。
两个端口通信:
控制连接:通常使用端口 21,用于发送命令和接收响应(如登录、列出文件等)。数据连接:通常使用端口 20(主动模式)或其他动态端口(被动模式),用于实际的文件传输。
支持多种传输模式:
文本模式:用于传输文本文件。二进制模式:用于传输图片、程序、压缩包等非文本文件。
用户认证:
大多数 FTP 服务器需要用户名和密码登录。也存在“匿名 FTP”,允许用户以“anonymous”身份访问公开文件(如一些开源软件下载站)。
常见用途:
网站维护:开发者上传网页文件到服务器。文件共享:在组织内部或对外提供大文件下载。远程备份:将本地文件备份到远程服务器。
三、FTP应用场景
由于传统的 FTP 协议在传输过程中不加密,用户名、密码和文件内容都可能被窃听,因此通常FTP适合在受信任的网络中使用,但在公网或对安全性要求较高的场景下,建议使用 SFTP 或 FTPS 等更安全的协议。
四、FTP 与 HTTP 传输文件的区别
对比维度FTP(File Transfer Protocol)HTTP(HyperText Transfer Protocol)协议目的专为文件上传/下载设计主要用于网页内容传输(文本、图片等),也可传输文件端口控制连接:21;数据连接:20(主动模式)或动态端口默认端口:80(HTTP),443(HTTPS)连接方式双连接:控制连接 + 数据连接单连接,基于请求-响应模式安全性普通 FTP 明文传输(不安全);FTPS 支持加密HTTP 明文;HTTPS 使用 SSL/TLS 加密(推荐)认证机制用户名 + 密码登录服务器通常通过 Header(如 Authorization)认证,也可匿名操作能力持上传、下载、删除、重命名、目录列表等主要是 GET(下载)、POST(上传),操作较弱防火墙兼容性较差(尤其被动模式需开放多个端口)非常好(标准端口 80/443 几乎都开放)适用场景服务器间文件管理、批量操作Web 下载、API 接口、静态资源分发是否支持断点续传取决于客户端/服务器实现HTTP/1.1 支持 Range 请求,天然支持断点续传
总结: FTP 更适合需要频繁管理远程文件的场景(如运维)。 HTTP/HTTPS 更适合对外提供文件下载服务,尤其是通过浏览器访问。
五、 Java 如何分别实现用 FTP 和 HTTP 下载文件
方式 1:使用 FTP 下载文件(推荐 Apache Commons Net)
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class FtpDownloader {
public static void downloadFile() {
FTPClient ftpClient = new FTPClient();
try {
// 1. 连接 FTP 服务器
ftpClient.connect("ftp.example.com", 21);
ftpClient.login("username", "password");
ftpClient.enterLocalPassiveMode(); // 推荐使用被动模式
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 2. 获取远程文件输入流
try (var inputStream = ftpClient.retrieveFileStream("/remote/file.zip");
OutputStream outputStream = new FileOutputStream("file_downloaded.zip")) {
if (inputStream == null) {
System.err.println("文件不存在或无法读取");
return;
}
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
// 3. 必须调用此方法确认文件传输完成
boolean success = ftpClient.completePendingCommand();
if (success) {
System.out.println("FTP 文件下载成功!");
} else {
System.err.println("FTP 文件下载失败!");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
downloadFile();
}
}
方式 2:使用 HTTP 下载文件(Java 内置类或 HttpClient)
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Paths;
public class HttpDownloader {
public static void downloadFile() {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/file.zip"))
.header("User-Agent", "Mozilla/5.0") // 模拟浏览器
.build();
try {
HttpResponse
HttpResponse.BodyHandlers.ofFile(Paths.get("file_downloaded.zip")));
if (response.statusCode() == 200) {
System.out.println("HTTP 文件下载成功!");
} else {
System.err.println("HTTP 下载失败,状态码:" + response.statusCode());
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
downloadFile();
}
}
六、对比总结(Java 实现角度)
特性FTP(Commons Net)HTTP(HttpClient)是否需要第三方库是(如 Commons Net)Java 11+ 内置,无需依赖安全性需手动升级为 FTPSHTTPS 天然支持加密断点续传需手动实现(REST 命令)支持 Range: bytes=xxx- 头代码复杂度较高(连接、模式、命令)简单直观适用性适合内部系统文件管理适合 Web 资源、API、公有云下载
七、建议
优先使用 HTTP/HTTPS:
如果只是下载文件(如从 CDN、官网、API 获取),HTTP 是更现代、更简单、更安全的选择。
使用 FTP 的场景:
需要上传/管理远程服务器文件;对方只提供了 FTP 访问方式(如某些传统企业系统);建议使用 FTPS 或结合 SFTP(基于 SSH) 提高安全性。