Java压缩正在改变创建文件的日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java压缩正在改变创建文件的日期相关的知识,希望对你有一定的参考价值。

我使用了从https://www.mkyong.com/java/how-to-compress-files-in-zip-format/复制的以下代码来创建Zip文件

创建zip文件时,该条目将获取实际创建zip文件的日期。但是我想保留原始文件的日期。我在Mac OS上使用java 1.7

我可以考虑通过读取文件属性来设置zip条目的日期。但这是在拉链时保持日期的正确方法吗?

   package org.saurav.simpletests.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Zipper {


    public static void main( String[] args )
    {
        byte[] buffer = new byte[1024];

        try{

            FileOutputStream fos = new FileOutputStream("/Users/xxxx/Documents/Work//Data/Zipper/test.zip");
            ZipOutputStream zos = new ZipOutputStream(fos);
            ZipEntry ze= new ZipEntry("Sonar_Gerrit_Issue.png");

            zos.putNextEntry(ze);
            FileInputStream in = new FileInputStream("/Users/xxxx/Documents/Work/Data/Zipper/Sonar_Gerrit_Issue.png");
            File file  = new File("/Users/i054564/Documents/Work/Data/Zipper/Sonar_Gerrit_Issue.png");

            int len;;
            while ((len = in.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }

            in.close();
            zos.closeEntry();

            //remember close it
            zos.close();

            System.out.println("Done");

        }catch(IOException ex){
           ex.printStackTrace();
        }
    }
}
答案

您需要在压缩时设置日期,如下所示:

File file = new File("Sonar_Gerrit_Issue.png");
ZipEntry ze = new ZipEntry(file);
ze.setTime(file.lastModified());

解压缩需要相同:

File file = //unzipping here for ZipEntry ze
file.setLastModified(ze.getTime());
另一答案

由于您使用的是Java 1.7,因此可以使用FileSystem API,这将节省您的时间。

例如:

    Path zipFilePath = Paths.get("PathToZip");
    try (FileSystem fs = FileSystems.newFileSystem(zipFilePath, null)) {
        Path source = new File("pathToSonar_Gerrit_IssuePNG").toPath(); //external file
        Path dest = fs.getPath("/Sonar_Gerrit_Issue.png"); //file in the zip
        Files.setLastModifiedTime(source, Files.getLastModifiedTime(dest)); //copy modified attribute
        Files.copy(source, dest, StandardCopyOption.COPY_ATTRIBUTES ,StandardCopyOption.REPLACE_EXISTING);  //copy with replace option
    }

注意:替换路径以满足您的需求。

以上是关于Java压缩正在改变创建文件的日期的主要内容,如果未能解决你的问题,请参考以下文章

在不丢失原始创建日期的情况下解压缩多个文件[重复]

java代码在片段活动中不起作用

java Ftp上传创建多层文件的代码片段

简短的 tar 脚本:尝试将今天的日期添加到压缩文件名时出现“找不到命令”

用于创建单个 .m4s 片段的 Java mp4parser — 无效的 moov 框

求助java压缩图片存储大小的方法