用Java确定文件创建日期

Tod*_*odd 98 java filesystems date

在StackOverflow上有另一个类似的问题(如何在Java中获取文件的创建日期),但答案并不是真的存在,因为OP有不同的需求可以通过其他机制解决.我正在尝试创建一个目录中的文件列表,可以按年龄排序,因此需要文件创建日期.

经过大量的网络搜寻,我没有找到任何好办法.是否有获取文件创建日期的机制?

BTW,目前在Windows系统上,也可能需要它在Linux系统上工作.此外,我不能保证在名称中嵌入创建日期/时间的情况下将遵循文件命名约定.

rin*_*rer 155

只要文件系统提供,Java nio就可以选择访问creationTime和其他元数据.检查此链接

例如(根据@ ydaetskcoR的评论提供):

Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);

System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());
Run Code Online (Sandbox Code Playgroud)

  • 这将是最好的,但它是Java 7.我们仍然使用6,但我将调查我们的升级选项. (15认同)
  • 使用`readAttributes(file.toPath(),BasicFileAttributes.class)`否则你会得到:`没有为readAttributes找到合适的方法(File,Class <BasicFileAttributes>)方法Files.<A> readAttributes(Path,Class <A>,LinkOption ...)不适用(不能推断类型变量A(参数不匹配;文件不能转换为Path)) (7认同)
  • 文件创建日期在 JDK 8 上不可用(至少),因为在较新的 Linux 内核版本中添加了“statx”系统调用。 (2认同)

Ole*_*nko 14

我用这个代码使用JDK 7解决了这个问题:

package FileCreationDate;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class Main
{
    public static void main(String[] args) {

        File file = new File("c:\\1.txt");
        Path filePath = file.toPath();

        BasicFileAttributes attributes = null;
        try
        {
            attributes =
                    Files.readAttributes(filePath, BasicFileAttributes.class);
        }
        catch (IOException exception)
        {
            System.out.println("Exception handled when trying to get file " +
                    "attributes: " + exception.getMessage());
        }
        long milliseconds = attributes.creationTime().to(TimeUnit.MILLISECONDS);
        if((milliseconds > Long.MIN_VALUE) && (milliseconds < Long.MAX_VALUE))
        {
            Date creationDate =
                    new Date(attributes.creationTime().to(TimeUnit.MILLISECONDS));

            System.out.println("File " + filePath.toString() + " created " +
                    creationDate.getDate() + "/" +
                    (creationDate.getMonth() + 1) + "/" +
                    (creationDate.getYear() + 1900));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ent 13

作为这个问题的后续 - 因为它与创建时间有关,并讨论通过新的nio类获得它 - 现在看来JDK7的实现中你运气不好.附录:OpenJDK7中的行为相同.

在Unix文件系统上,您无法检索创建时间戳,只需获取上次修改时间的副本即可.太伤心了,但不幸的是真的.我不确定为什么会这样,但代码具体如此,如下所示.

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;

public class TestFA {
  static void getAttributes(String pathStr) throws IOException {
    Path p = Paths.get(pathStr);
    BasicFileAttributes view
       = Files.getFileAttributeView(p, BasicFileAttributeView.class)
              .readAttributes();
    System.out.println(view.creationTime()+" is the same as "+view.lastModifiedTime());
  }
  public static void main(String[] args) throws IOException {
    for (String s : args) {
        getAttributes(s);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Jor*_*sys 11

这是如何Java使用BasicFileAttributes类获取文件创建日期的基本示例:

   Path path = Paths.get("C:\\Users\\jorgesys\\workspaceJava\\myfile.txt");
    BasicFileAttributes attr;
    try {
    attr = Files.readAttributes(path, BasicFileAttributes.class);
    System.out.println("Creation date: " + attr.creationTime());
    //System.out.println("Last access date: " + attr.lastAccessTime());
    //System.out.println("Last modified date: " + attr.lastModifiedTime());
    } catch (IOException e) {
    System.out.println("oops error! " + e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)


Car*_*icz 9

API java.io.File仅支持获取上次修改时间.互联网在这个话题上也很安静.

除非我遗漏了一些重要内容,否则Java库(包括但尚未包括Java 7)不包含此功能.因此,如果您对此非常不满,一种解决方案是编写一些C(++)代码来调用系统例程并使用JNI调用它.但是,大多数这项工作似乎已经在一个名为JNA的库中完成了.

尽管如此,您可能仍需要在Java中执行一些特定于操作系统的编码,因为您可能找不到Windows和Unix/Linux/BSD/OS X中可用的相同系统调用.

  • `File`类没有这种能力的原因是大多数文件系统甚至不跟踪这些信息.而那些并不总是同意它应该何时更新. (6认同)
  • 是的,Java 7会很棒,因为nio似乎具有基本属性.从来没有想过我会抱怨过早出生!;) (2认同)

Jac*_*k S 9

在Windows系统上,您可以使用免费的FileTimes库.

使用Java NIO.2(JDK 7)和java.nio.file.attribute包将来会更容易.

但请记住,大多数Linux文件系统不支持文件创建时间戳.