Я следовал следующему подходу к распаковке zip с помощью Apache Commons сжимает:
Но поскольку я использую OutputStream и IOUtils.copy(ais, os);(код ниже) для распаковки и копирования файла, метка времени не сохраняется. Есть ли другой способ напрямую скопировать файл из zip, чтобы можно было сохранить временную метку файла.
try (ArchiveInputStream ais =
asFactory.createArchiveInputStream(
new BufferedInputStream(
new FileInputStream(archive)))) {
System.out.println("Extracting!");
ArchiveEntry ae;
while ((ae = ais.getNextEntry()) != null) {
// check if file needs to be extracted {}
if (!extract())
continue;
if (ae.isDirectory()) {
File dir = new File(archive.getParentFile(), ae.getName());
dir.mkdirs();
continue;
}
File f = new File(archive.getParentFile(), ae.getName());
File parent = f.getParentFile();
parent.mkdirs();
try (OutputStream os = new FileOutputStream(f)) {
IOUtils.copy(ais, os);
os.close();
} catch (IOException innerIoe) {
...
}
}
ais.close();
if (!archive.delete()) {
System.out.printf("Could not remove archive %s%n",
archive.getName());
archive.deleteOnExit();
}
} catch (IOException ioe) {
...
}
Обновлено: С помощью приведенного ниже ответа jbx следующие изменения заставят его работать.
IOUtils.copy(ais, os);
os.close();
outFile.setLastModified(entry.getLastModifiedTime().toMillis()); // this line




Вы можете установить атрибут файла lastModifiedTime с помощью NIO. Сделайте это с файлом сразу после того, как вы его запишете (после того, как вы его закроете). Операционная система отметила бы свое время последнего изменения текущим временем в этот момент.
https://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html
Вам нужно будет получить время последнего изменения из zip-файла, поэтому, возможно, с помощью NIO Zip Filesystem Provider` для просмотра и извлечения файлов из архива будет лучше, чем ваш текущий подход (если только используемые вами API-интерфейсы не предоставляют вам ту же информацию).
https://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html
Это сработало. Что я делал неправильно, так это:
outFile.setLastModified(entry.getLastModifiedTime().toMillis());перед строкой:IOUtils.copy(ais, os);. Перемещение его после того, какos.close()сделал свое дело. Ваше утверждение Сделайте это с файлом сразу после того, как вы его запишете (после того, как вы его закроете) было ключевым