在Linux上用java获取文件的更改时间而不是修改时间

2 人关注

在java中是否有办法在linux上访问一个文件的改变时间属性?

我试图使用java.io.File.lastModified()方法,但这个方法只返回文件的修改时间属性。

我想做的是检测一个文件上传到linux服务器的时间。我注意到,修改时间属性是我本地机器上修改文件的时间戳,然而,改变时间属性是上传到linux服务器的时间。

谢谢你的任何建议。

3 个评论
没有 "java "的方式来做这件事,如以下所述 this comment 关于类似的问题:没有简单的方法来访问文件更改时间。你也许可以从Linux的JVM实现中获得一些东西(对此表示怀疑),或者写一个shell脚本来读取这个属性。或者改变上传者的方式,使其每次都强制设置文件的LastModified时间。
为什么要关心它是具体的改变时间呢?最后修改时间捕捉的是文件内容被改变的最后时间。如果我没有改变任何内容,你为什么要做出反应?
我有一个程序,将时间从一个文件存储到数据库中(目前是修改时间)。可能有更多的人拥有该文件的不同版本,他们将该文件上传到linux服务器上。我想存储最后一次上传的时间(更改时间),而不是最后一次修改的时间(以防有人在修改后几个小时后才上传文件)。在这种情况下,有必要在修改后立即上传文件。
java
linux
user1607656
发布于 2017-04-04
1 个回答
Justin Lee
Justin Lee
发布于 2018-06-26
已采纳
0 人赞同

你可以使用下面的方法来获得一个文件的变化时间。

Files.getAttribute(new File("<path to a file>").toPath(),"unix:ctime")

以下是示例代码。

   import java.util.*;
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
public class Test{
    public static void main(String[] args){
                   System.out.println(Files.getAttribute(new File("b").toPath(),"unix:ctime"));
                   System.out.println(new Date(((FileTime)Files.getAttribute(new File("b").toPath(),"unix:ctime")).toMillis()));
                catch (Exception e)
                    e.printStackTrace();
When running `LANG=en_us.UTF-8 stat b` on the console, the output is:
      File: 'b'
      Size: 0               Blocks: 0          IO Block: 4096   regular empty file
    Device: fd00h/64768d    Inode: 101210225   Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: unconfined_u:object_r:admin_home_t:s0
    Access: 2018-06-26 10:16:18.649378326 +0800
    Modify: 2018-06-26 10:16:18.649378326 +0800
    Change: 2018-06-26 10:17:06.009384678 +0800
     Birth: -
Running the example code with the `Test` class provides the following output: