我遵循以下方法使用apache commons compress解压缩zip:
但是由于我使用的是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's答案的帮助下,以下更改将使其起作用。
IOUtils.copy(ais, os);
os.close();
outFile.setLastModified(entry.getLastModifiedTime().toMillis()); // this line
答案 0 :(得分:1)
您可以使用NIO设置lastModifiedTime
文件属性。 将其准确地写入文件中(在将其关闭后)。操作系统会在该点将其最后修改时间标记为当前时间。
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