确定Java中的文件创builddate

在StackOverflow( 如何获得Java文件的创builddate)上还有另外一个类似的问题,但答案并不存在,因为OP有不同的需求,可以通过其他机制来解决。 我正在尝试创build一个可以按年龄sorting的文件列表,因此需要创build文件date。

在networking的大规模拖网之后,我没有find任何好的方法来做到这一点。 有没有获得文件创builddate的机制?

顺便说一句,目前在Windows系统上,也可能需要这个工作在Linux系统上。 另外,我不能保证在创builddate/时间embedded到名称中的情况下,将遵循文件命名约定。

只要文件系统提供, Java nio就可以select访问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()); 

作为这个问题的一个后续 – 由于它特别涉及到创build时间,并讨论通过新的nio类来获得它 – 现在看来,在JDK7的实现中,你倒霉了。 附录:OpenJDK7中也有相同的行为。

在Unix文件系统中,您无法检索创build时间戳,只需获取上次修改时间的副本。 太难过了,但不幸的是真的。 我不确定这是为什么,但代码具体做到这一点,如下所示。

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

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

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

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

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

 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文件的创builddate的基本示例:

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

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

除非我遗漏了一些重要的东西,否则Java库(不包括Java 7)不包括这个function。 所以,如果你为此感到绝望,一个解决scheme就是编写一些C(++)代码来调用系统例程并使用JNI来调用它。 不过,这项工作的大部分似乎已经在名为JNA的图书馆中完成了。

但是,您可能仍然需要在Java中为操作系统编写特定的代码,因为您可能无法在Windows和Unix / Linux / BSD / OS X中find相同的系统调用。