在 Java 中确定文件创建日期

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

我还没有找到任何好的方式来做到这一点后,大量的网络拖网。是否有获取文件创建日期的机制?

顺便说一句,目前在 Windows 系统上,可能也需要在 Linux 系统上使用它。另外,我不能保证在名称中嵌入创建日期/时间的地方会有一个文件变数命名原则。

202831 次浏览

java.io.File的 API 只支持获取最后的 修改过的时间。互联网上对这个话题也很沉默。

除非我遗漏了什么重要的东西,否则 Java 库(直到但尚未包括 Java7)不包括这个功能。因此,如果您非常渴望这样做,一个解决方案是编写一些 C (+ +)代码来调用系统例程,并使用 JNI 调用它。不过,这些工作的大部分似乎已经在一个名为 JNA的库中完成了。

不过,您可能仍然需要用 Java 编写一些特定于操作系统的代码,因为您可能不会在 Windows 和 Unix/Linux/BSD/OS X 中找到相同的系统调用。

Java nio 有访问 creationTime和其他元数据的选项,只要文件系统提供这些选项。 看看 这个链接

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

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


System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());

在 Windows 系统上,可以使用免费的 文件时代库。

Java NIO.2(JDK 7)和 Java.NIO.file.tribute 包的未来,这将更加容易。

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

作为这个问题的后续——因为它特别关系到创建时间,并讨论通过新的 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);
}
}
}

我使用 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));
}
}
}

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

   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());
}

在 java1.7 + 中 您可以使用此代码获取文件的创建时间!

private static LocalDateTime getCreateTime(File file) throws IOException {
Path path = Paths.get(file.getPath());
BasicFileAttributeView basicfile = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS);
BasicFileAttributes attr = basicfile.readAttributes();
long date = attr.creationTime().toMillis();
Instant instant = Instant.ofEpochMilli(date);
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}