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

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

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

person Janny    schedule 16.02.2020    source источник
comment
stackoverflow.com/questions/10824027/get- метаданные-файла   -  person Rajat    schedule 16.02.2020
comment
API — ваш друг: java.nio.file.Files#copy   -  person Abra    schedule 16.02.2020
comment
В Javadoc есть специальное предупреждение против того, как вы используете available(), и в любом случае нет необходимости считывать весь файл в память.   -  person user207421    schedule 16.02.2020


Ответы (3)


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

person pxcv7r    schedule 16.02.2020
comment
Вы знаете о классе java.nio.file.Files и его методе copy()? Класс был добавлен в JDK 7. - person Abra; 16.02.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();
}
person Abra    schedule 16.02.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.toFile() возвращает соответствующий File, а File.toPath() возвращает соответствующий Path.
Таким образом, даже если вы манипулируете File в качестве входных данных, реализация все равно может использовать Path API, не нарушая его.

person davidxxx    schedule 16.02.2020