在StackOverflow上有一个类似于我的问题 (如何在Java中获取文件的创建日期),但是答案并没有解决我的问题,因为原贴作者的需求不同,可以通过其他机制解决。我正在尝试创建一个目录中按年龄排序的文件列表,因此需要文件的创建日期。
在网上搜寻了很多,没有找到好的方法。是否有一种机制可以获取文件的创建日期?
顺便说一下,我目前在Windows系统上,可能也需要在Linux系统上工作。另外,我不能保证遵循将创建日期/时间嵌入名称的文件命名约定。
在StackOverflow上有一个类似于我的问题 (如何在Java中获取文件的创建日期),但是答案并没有解决我的问题,因为原贴作者的需求不同,可以通过其他机制解决。我正在尝试创建一个目录中按年龄排序的文件列表,因此需要文件的创建日期。
在网上搜寻了很多,没有找到好的方法。是否有一种机制可以获取文件的创建日期?
顺便说一下,我目前在Windows系统上,可能也需要在Linux系统上工作。另外,我不能保证遵循将创建日期/时间嵌入名称的文件命名约定。
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());
readAttributes(file.toPath(), BasicFileAttributes.class)
,否则会出现以下错误:no suitable method found for readAttributes(File,Class<BasicFileAttributes>) method Files.<A>readAttributes(Path,Class<A>,LinkOption...) is not applicable (cannot infer type-variable(s) A (argument mismatch; File cannot be converted to Path))
。 - Hooli我用以下代码使用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));
}
}
}
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);
}
}
}
stat
也不起作用。除非你运行的内核高于4.11,glibc高于2.28,coreutils高于8.31,然后 stat
将报告文件的_birth_。参见相关答案 https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/50184#50184
目前 JDK 不使用 statx 系统调用。 - bric3BasicFileAttributes
类来编写 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());
}
java.io.File
的API仅支持获取最后修改时间。关于这个话题在互联网上也非常安静。
除非我遗漏了什么重要的内容,否则Java库本身(包括Java 7之前)并不包括此功能。因此,如果你迫切需要这个功能,一种解决方案是编写一些C(++)代码来调用系统例程,并使用JNI进行调用。不过,大部分这项工作似乎已经为你完成在一个叫做JNA的库中。
然而,你可能仍需要在Java中进行一些特定于操作系统的编码,因为你可能无法在Windows和Unix/Linux/BSD/OS X中找到相同的系统调用。
File
类没有这种功能的原因是大多数文件系统甚至不跟踪此信息。而那些跟踪此信息的文件系统在更新时间方面也不总是一致的。 - Syntactic在Windows系统上,您可以使用免费的FileTimes库。
在未来,使用Java NIO.2 (JDK 7)和java.nio.file.attribute包将更加容易。
但请记住,大多数Linux文件系统不支持文件创建时间戳。
在Java 1.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());
}
Instant.ofEpochMilli(date)
这个方法吗?谢谢。 - Kirill KarmazinInstant instant = attr.creationTime().toInstant();
。 - Ole V.V.基本上,当您从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());
}
SimpleDateFormat
类。从 creationTime()
得到的 FileTime
对象有一个 toInstant
方法,可以给您一个 Instant
,您可以将其转换为所需的时区(例如 ZoneId.systemDefault()
),并使用现代的 DateTimeFormatter
进行格式化。结果代码会稍微长一些,这是一个优点,因为它更明确地表达了正在发生的事情,因此读起来更清晰、自然。 - Ole V.V.