[java] Java에서 파일 생성 날짜 결정
StackOverflow ( Java에서 파일 생성 날짜를 얻는 방법) 에 대한 또 다른 유사한 질문이 있지만 OP에는 다른 메커니즘을 통해 해결할 수있는 다른 요구가 있었기 때문에 대답은 실제로 없습니다. 연령별로 정렬 할 수있는 디렉터리에 파일 목록을 만들려고하므로 파일 생성 날짜가 필요합니다.
나는 웹을 많이 트롤링 한 후에 이것을 할 좋은 방법을 찾지 못했습니다. 파일 생성 날짜를 가져 오는 메커니즘이 있습니까?
현재 Windows 시스템에있는 BTW는 Linux 시스템에서도 작동하기 위해이 기능이 필요할 수 있습니다. 또한 생성 날짜 / 시간이 이름에 포함 된 위치에서 파일 명명 규칙을 따를 것이라고 보장 할 수 없습니다.
답변
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());
답변
이 코드로 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));
}
}
}
답변
이 질문에 대한 후속 조치로-특히 생성 시간과 관련이 있고 새로운 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);
}
}
}
답변
다음은 클래스를 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());
}
답변
의 API java.io.File
는 마지막 수정 시간 가져 오기만 지원합니다 . 그리고 인터넷은이 주제에 대해서도 매우 조용합니다.
중요한 것을 놓치지 않는 한 Java 라이브러리는있는 그대로 (Java 7까지 포함되지 않음)에는이 기능이 포함되어 있지 않습니다. 따라서이를 위해 절실한 경우 한 가지 해결책은 시스템 루틴을 호출하고 JNI를 사용하여 호출하는 C (++) 코드를 작성하는 것입니다. 하지만이 작업의 대부분은 JNA 라는 라이브러리에서 이미 완료된 것으로 보입니다 .
Windows 및 Unix / Linux / BSD / OS X에서 사용 가능한 동일한 시스템 호출을 찾을 수 없기 때문에이를 위해 Java에서 약간의 OS 특정 코딩을 수행해야 할 수도 있습니다.
답변
Windows 시스템에서는 무료 FileTimes를 사용할 수 있습니다. 라이브러리를 있습니다.
Java NIO.2 (JDK 7) 및 java.nio.file.attribute 패키지 를 사용하면 앞으로 더 쉬워 질 것입니다. 입니다.
그러나 대부분의 Linux 파일 시스템 은 파일 생성 타임 스탬프를 지원하지 않습니다 .
답변
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());
}