在Java中确定文件创建日期

pxy2qtax  于 2023-04-10  发布在  Java
关注(0)|答案(8)|浏览(139)

我在StackOverflow(How to get creation date of a file in Java)上还有一个类似的问题,但答案并不存在,因为OP有一个不同的需求,可以通过其他机制来解决。我正在尝试创建一个目录中的文件列表,可以按年龄排序,因此需要文件创建日期。
我在网上搜索了很久,还没有找到任何好的方法来做到这一点。有没有一种机制可以获取文件创建日期?
顺便说一句,目前在Windows系统上,可能需要这个工作在Linux系统以及。此外,我不能保证文件命名约定将遵循创建日期/时间嵌入在名称中。

lrpiutwd

lrpiutwd1#

Java nio提供了访问creationTime和其他元数据的选项,只要文件系统提供。请查看this link

例如(根据@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());
wa7juj8i

wa7juj8i2#

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

jk9hmnmh3#

作为这个问题的后续-因为它特别涉及到创建时间,并讨论了通过新的nio类获得它-现在在JDK 7的实现中,您似乎运气不佳。OpenJDK 7中也有相同的行为。
在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);
    }
  }
}
ruoxqz4g

ruoxqz4g4#

这是一个基本的例子,说明如何使用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());
}
xa9qqrwz

xa9qqrwz5#

java.io.File的API只支持获取最后一次修改的时间,互联网上对这个主题也很安静。
除非我遗漏了一些重要的东西,否则Java库(直到Java 7,但还没有包括Java 7)并不包含此功能。因此,如果您迫切需要此功能,一个解决方案是编写一些C(++)代码来调用系统例程并使用JNI调用它。不过,大多数工作似乎已经在名为JNA的库中为您完成。
不过,您可能仍然需要在Java中执行一些特定于操作系统的编码,因为您可能无法在Windows和Unix/Linux/BSD/OSX中找到相同的系统调用。

62lalag4

62lalag46#

在Windows系统上,您可以使用免费的FileTimes库。
将来使用JavaNIO.2(JDK7)和java.nio.file.attribute包时,这将变得更容易。
但是请记住,大多数Linux文件系统不支持文件创建时间戳。

jmp7cifd

jmp7cifd7#

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

dgenwo3n8#

基本上,从BasicFileAttributeView对象获得创建日期后,您应该格式化日期以显示:

String modifiedDate;
Path inPath = Paths.get(yourfile.getAbsolutePath());
BasicFileAttributes attr;
try {
    attr = Files.readAttributes(inPath, BasicFileAttributes.class);
} catch (IOException e) {
    attr = null;
}
        
if (attr == null) {
     this.modifiedDate = null;
} else {
    this.modifiedDate = simpleDateFormat.format(attr.creationTime().toMillis());
}

相关问题