在Java开发中,获取FTP服务器上文件的修改时间是常见需求,尤其在文件同步、版本控制或状态监控等场景,本文将介绍通过Java实现这一功能的具体方法,包括常用库的选择、核心代码步骤及注意事项。

使用Apache Commons Net库实现
Apache Commons Net是Java操作FTP最成熟的库之一,提供了丰富的API支持文件传输与服务器交互,首先需在项目中添加依赖(Maven坐标):
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.9.0</version>
</dependency>
核心步骤包括:初始化FTPClient、连接服务器、登录、获取文件列表及解析时间信息。
核心代码示例
以下是完整实现流程,关键步骤附有注释说明:

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class FtpFileTimeGetter {
public static void main(String[] args) {
FTPClient ftpClient = new FTPClient();
String server = "ftp.example.com";
int port = 21;
String username = "yourUsername";
String password = "yourPassword";
String remoteFilePath = "/path/to/your/file.txt";
try {
// 1. 连接FTP服务器
ftpClient.connect(server, port);
if (!ftpClient.login(username, password)) {
throw new RuntimeException("FTP登录失败");
}
// 2. 设置文件传输模式(二进制模式避免文件损坏)
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 开启被动模式(适用于防火墙环境)
ftpClient.enterLocalPassiveMode();
// 3. 获取文件信息
FTPFile[] files = ftpClient.listFiles(remoteFilePath);
if (files.length == 0) {
System.out.println("文件不存在");
return;
}
FTPFile ftpFile = files[0];
long lastModifiedTime = ftpFile.getTimestamp().getTimeInMillis();
// 4. 转换时间格式(处理时区问题)
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8")); // 根据服务器时区调整
String formattedTime = dateFormat.format(new Date(lastModifiedTime));
System.out.println("文件修改时间: " + formattedTime);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 5. 断开连接
try {
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
关键注意事项
-
时区处理
FTP服务器返回的时间可能为UTC或其他时区,需通过SimpleDateFormat指定目标时区(如GMT+8)确保显示正确,若服务器返回的是Unix时间戳(秒级),需转换为毫秒级(* 1000L)后再处理。 -
FTP服务器类型差异
不同FTP服务器(如vsftpd、FileZilla)对时间戳的存储格式可能不同,部分服务器可能返回字符串格式的时间(如"2023-10-01 12:00:00"),此时需通过ftpFile.getTimestamp().getTime()获取时间戳,或使用正则解析字符串。 -
被动模式设置
若FTP服务器位于防火墙后,需调用enterLocalPassiveMode()开启被动模式,否则可能因数据连接失败导致获取文件列表超时。
-
异常处理与资源释放
网络异常、认证失败等情况需捕获IOException,并在finally块中确保FTPClient断开连接,避免资源泄漏。
通过Apache Commons Net库,Java可以便捷地获取FTP文件的修改时间,核心流程包括连接服务器、登录、获取文件列表及时间格式化,实际开发中需注意时区适配、服务器类型差异及被动模式配置,确保代码健壮性,对于复杂场景(如批量获取文件时间),可结合多线程或异步编程优化性能,掌握上述方法后,即可灵活应对文件同步、监控等业务需求。
















