在java中记录上次访问时间和上次修改时间?

Has*_*tha 6 java nio java-io

在我的应用程序中我使用以下方法读取文件,

public void readFIleData(String path) {
    BufferedReader br = null;
    try {
        String sCurrentLine;
        br = new BufferedReader(new FileReader(path));
        while ((sCurrentLine = br.readLine()) != null) {
            System.out.println("Data : "+sCurrentLine);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还使用以下方法获取文件的上次访问时间和上次修改时间,

public void getFIleInfo(String path) {
    Path file = Paths.get(path);
    try {
        BasicFileAttributes attrs = Files.readAttributes(file, BasicFileAttributes.class);
        FileTime accessTime = attrs.lastAccessTime();
        System.out.println("accessTime : "+accessTime.toMillis());
        FileTime modifiedTime = attrs.lastModifiedTime();
        System.out.println("modifiedTime : "+modifiedTime.toMillis());
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

我按照以下顺序运行上述方法,

1-> getFIleInfo()
2-> readFIleData()
3-> getFIleInfo()
Run Code Online (Sandbox Code Playgroud)

我得到了以下输出,

accessTime : 1462943491685
modifiedTime : 1462943925846
Data : erteuyuittdgfdfghjkhw5643rtrr66664fdghf
accessTime : 1462943491685
modifiedTime : 1462943925846
Run Code Online (Sandbox Code Playgroud)

这是字符串格式的输出时间,

accessTime : 2016-05-11T05:11:31.685881Z
modifiedTime : 2016-05-11T07:39:28.237884Z
Data : erteuyuittdgfdfghjkhw5643rtrr66LE229F1HBQ664fdghf
accessTime : 2016-05-11T05:11:31.685881Z
modifiedTime : 2016-05-11T07:39:28.237884Z
Run Code Online (Sandbox Code Playgroud)

我对此输出有疑问,因为访问时间与读取文件数据之前保持一致.有人可以向我解释一下java上次访问时间和上次修改时间的实际意义吗?

Joa*_*nha 0

如果你查看 api 你会发现这个。

如果文件系统实现不支持时间戳来指示上次访问的时间,则此方法返回特定于实现的默认值,通常last-modified-time表示FileTime 纪元 (1970-01-01T00:00:00Z)。

看起来“问题”很可能与您的文件系统和操作系统有关。我不认为你的代码有什么问题。

例如,对于Windows 操作系统, 在 Vista 和 Windows 7 中默认启用NtfsDisableLastAccessUpdate选项,但您可以使用以下命令行禁用它:

fsutil behavior set disablelastaccess 0
Run Code Online (Sandbox Code Playgroud)

正如我在对你的问题的评论中所说,我能够在 Windows 真机中解决这个问题,但不能在虚拟机中解决。如果您仍然遇到此问题,请在执行任何操作之前发出此命令以查看注册表的情况:

fsutil behavior query disablelastaccess 
Run Code Online (Sandbox Code Playgroud)

最后一点,我不必重新启动 Windows 或 Intellij(我在其中运行测试)。结果是立竿见影的,我可以看到,对于值 1,上次访问的时间戳不会改变,而对于值 0,它会改变。