从 Java 获取具有毫秒级分辨率的文件 mtime

2022-09-03 14:05:40

当我使用 从 Java 读取文件时,返回值被截断为整秒。我知道这适用于其他系统以获得毫秒级分辨率的mtimes,那么我的有什么不同呢?mtimeFiles.getLastModifiedTime

这是一个完整的独立测试,可以编译和运行:

import java.nio.file.attribute.FileTime;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Test {
  public static void main(String[] args) throws java.io.IOException {
    FileTime timestamp = Files.getLastModifiedTime(Paths.get("/tmp/test"));
    System.out.println(timestamp.toMillis());
  }
}

输出是(使用我的特定测试文件),而显示:1405602038000ls

$ ls --full-time /tmp/test                                                                                                                                                                                                    
-rw-rw-r-- 1 daniel daniel 0 2014-07-17 16:00:38.413008992 +0300 /tmp/test

我希望Java输出是。1405602038413

我在 Linux 上运行 ext4。我尝试了openjdk 1.7和Oracle jdk 1.8。


答案 1

此提交在 Java 8 中添加了在 *nix 系统上以更高精度获取文件时间戳的功能,但是,在本机端,它需要符合 POSIX 2008:

#if (_POSIX_C_SOURCE >= 200809L) || defined(__solaris__)
    (*env)->SetLongField(env, attrs, attrs_st_atime_nsec, (jlong)buf->st_atim.tv_nsec);
    (*env)->SetLongField(env, attrs, attrs_st_mtime_nsec, (jlong)buf->st_mtim.tv_nsec);
    (*env)->SetLongField(env, attrs, attrs_st_ctime_nsec, (jlong)buf->st_ctim.tv_nsec);
#endif

而且,显然,您使用的Java版本没有设置它,因此时间戳的纳秒部分不可用并保持零。


答案 2

我看了源代码:

在 Java 7 情况下,该方法以 1 秒的精度给出上次修改的时间戳:

在Java 8的情况下,它看起来应该给出微秒级的精度:

但在这两种情况下,代码似乎都没有提供一种以不同精度获取时间戳的方法。