在将文件从源复制到目标时保留文件上次修改日期时间
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对应File
和File.toPath()
returns对应Path
.
因此,即使您将 File
s 作为输入进行操作,实现仍然可以使用 Path
API 而不会破坏它。
我正在尝试将文件从一个位置复制到另一个位置。在将其从源复制到目标时,目标文件采用当前日期时间。如何使目标文件日期与源文件日期相同。
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对应File
和File.toPath()
returns对应Path
.
因此,即使您将 File
s 作为输入进行操作,实现仍然可以使用 Path
API 而不会破坏它。