在将文件从源复制到目标时保留文件上次修改日期时间

Preserve file last modified date time while copying it from source to target

我正在尝试将文件从一个位置复制到另一个位置。在将其从源复制到目标时,目标文件采用当前日期时间。如何使目标文件日期与源文件日期相同。

FileInputStream source = new FileInputStream("D:\test\test.txt");
OutputStream target = new FileOutputStream("D:\test.txt");
byte[] buffer = new byte[source.available()];
source.read(buffer);
target.write(buffer);
source.close();
target.close();`

这是由 java.io.File class 提供的。您需要先创建它的实例并将其传递给流:

File input = new File("D:\test\test.txt");
File output = new File("D:\test.txt");
try( FileInputStream source = new FileInputStream(input);
     OutputStream target = new FileOutputStream(output)){
    byte[] buffer = new byte[source.available()];
    source.read(buffer);
    target.write(buffer);
}
long modified = input.lastModified();
output.setLastModified(modified);

顺便说一句:我假设您至少使用 Java 7,所以我更改了您的代码以使用 try-with-resources 功能。强烈建议这样做,因为它还负责在引发异常时关闭资源。

自 JDK7 起,以下代码将复制一个文件,复制的文件将具有与原始文件相同的属性,这意味着目标文件将与源文件具有相同的日期.

java.nio.file.Path source = java.nio.file.Paths.get("D:\test\test.txt");
java.nio.file.Path target = java.nio.file.Paths.get("D:\test.txt");
try {
    java.nio.file.Files.copy(source, target, java.nio.file.StandardCopyOption.COPY_ATTRIBUTES);
}
catch (java.io.IOException x) {
    x.printStackTrace();
}

如果可以,请使用路径 API。

例如要在新文件中保留原始文件的所有属性,请使用 Files.copy(Path source, Path target, CopyOption... options) :

try {
   Path copiedFile = 
   Files.copy(Paths.get("D:\test\test.txt"), Paths.get("D:\test.txt"), 
             StandardCopyOption.COPY_ATTRIBUTES);   
}
catch (IOException e){
  // handle that
}

StandardCopyOption.COPY_ATTRIBUTES 枚举状态:

Minimally, the last-modified-time is copied to the target file if supported by both the source and target file stores.

如果只想复制最后修改的时间属性,那并不复杂,只需在复制后添加该设置并删除 CopyOption 参数,例如:

Path originalFile = Paths.get("D:\test.txt")
try {
   Path copiedFile = 
   Files.copy(Paths.get("D:\test\test.txt"), originalFile);   
   Files.setLastModifiedTime(copiedFile, 
          Files.getLastModifiedTime(originalFile));
}
catch (IOException e){
  // handle that
}

最后注意Path和File是互通的:Path.toFile()returns对应FileFile.toPath()returns对应Path.
因此,即使您将 Files 作为输入进行操作,实现仍然可以使用 Path API 而不会破坏它。