Сохранить дату последнего изменения файла при копировании его из источника в цель - PullRequest
1 голос
/ 16 февраля 2020

Я пытаюсь скопировать файл из одного места в другое. При копировании его из источника в цель, целевой файл принимает текущую дату и время. Как сделать дату целевого файла такой же, как у исходного файла.

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();`

Ответы [ 3 ]

2 голосов
/ 16 февраля 2020

Это обеспечивается классом java.io.File. Вам нужно сначала создать его экземпляр и передать его в потоки:

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, поэтому я изменил ваш код, чтобы использовать попытку с особенность ресурсов. Это настоятельно рекомендуется, поскольку оно также заботится о закрытии ресурсов в случае возникновения исключения.

1 голос
/ 16 февраля 2020

Просто используйте Path 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:

Как минимум время последнего изменения копируется в целевой файл, если поддерживается как исходным, так и целевым хранилищами файлов.

Если вы хотите скопировать только последний измененный атрибут времени, который не является более сложным, просто добавьте этот параметр после копирования и удалите аргумент 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() возвращает соответствующие File, а File.toPath() возвращает соответствующие Path.
Так что даже если вы манипулируете File s в качестве ввода, реализация все еще может использовать API Path, не нарушая его.

1 голос
/ 16 февраля 2020

Начиная с JDK 7, следующий код создаст копию файла, и скопированный файл будет иметь те же атрибуты, что и исходный файл, что означает, что целевой файл будет иметь ту же дату, что и исходный файл.

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...