从Java获得毫秒分辨率的文件mtime

dan*_*mak 10 java file last-modified

当我mtime使用Java 读取文件时Files.getLastModifiedTime,返回值被截断为整秒.我知道这可以在其他系统上使用毫秒分辨率的mtimes,那么我的不同之处呢?

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

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

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

$ ls --full-time /tmp/test                                                                                                                                                                                                    
-rw-rw-r-- 1 daniel daniel 0 2014-07-17 16:00:38.413008992 +0300 /tmp/test
Run Code Online (Sandbox Code Playgroud)

我希望Java输出1405602038413.

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

izs*_*tas 8

通过此提交在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
Run Code Online (Sandbox Code Playgroud)

而且,显然,您正在使用的Java构建没有设置它,因此时间戳的纳秒部分不可用并且保持为零.