当前位置: 首页 > 知识库问答 >
问题:

Java,如果内容相同,则创建两个相同的zip文件

农鸿德
2023-03-14
    public static final String SLASH = "/";
    public static void zip(int level, File zipfile, File... files) throws IOException {
            try (FileOutputStream fo = new FileOutputStream(zipfile); ZipOutputStream zo = new ZipOutputStream(fo)) {
                    zo.setLevel(level);

                    for (File file : files) {
                            zip("", file, zo);
                    }

                    zo.flush();
                    zo.finish();
                    zo.close();

                    // !!!!!!!! Tried these !!!!!!!!!
                    long time = Cal.date(1970, Cal.Month.JANUARY, 1).getTime();
                    zipfile.setLastModified(time);
                    Files.setAttribute(zipfile.toPath(), "lastAccessTime", FileTime.fromMillis(time) );
            }
    }

    public static File unzip(File zipfile, File to) throws IOException {
            ZipFile                         filezipped = new ZipFile( zipfile );
            Enumeration<? extends ZipEntry> entries    = filezipped.entries( ) ;

            while ( entries.hasMoreElements() ) {

                    ZipEntry zipEntry = entries.nextElement( )             ;
                    File     file     = new File( to, zipEntry.getName( ) );

                    if ( zipEntry.isDirectory() ) {
                            file.mkdirs();
                    }
                    else {
                            file.getParentFile().mkdirs();
                            try ( InputStream in = filezipped.getInputStream(zipEntry) ) {
                                    Files.copy( in, file.toPath() );
                            }
                    }
            }

            return zipfile;
    }

    private static void zip(String base, File file, ZipOutputStream zo) throws IOException {
            String path   = base + file.getName();
            if ( file.isDirectory() ) {
                    path += SLASH;

                    zo.putNextEntry( new ZipEntry(path) );

                    for (File ff : file.listFiles()) {
                            zip(path, ff, zo);
                    }

                    zo.closeEntry();

            } else {
                    zo.putNextEntry( new ZipEntry(path) );

                    Files.copy(file.toPath(), zo);

                    zo.closeEntry();
            }
    }

但是,zip文件将具有不同的校验和,即使文件的内容不变。在使用Git提交文件时,这是一个问题。

如何确保压缩后的文件每次都保持不变,除非内容发生了更改?

共有1个答案

栾英资
2023-03-14

ZIP文件本身的时间戳并不重要,但请尝试将ZIP条目的最后修改时间设置为常量:

ZipEntry entry = new ZipEntry(path);
entry.setTime(0);

zo.putNextEntry(entry);

有关更多信息,请参见settimeJavaDoc。

更新

if (e.time == -1) {
    e.setTime(System.currentTimeMillis());
}
 类似资料:
  • 问题内容: 我的Java应用程序需要具有比较文件系统中两个不同文件并确定它们的二进制内容是否相同的能力。 这是我当前的代码: 任何有关如何正确进行比较功能的提示或建议,将不胜感激。 问题答案: 最简单的方法是将内容读取为两个字符串,例如 ,然后对这些执行。您是否需要更复杂的差分功能?

  • 我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。

  • 但是我有两种回购方式 如何创建两个bean,其中一个是用注入的,另一个是用注入的?

  • 我有两个类,它们具有相同的类名并使用相同的包名。但是,这两个类文件位于不同的目录中。这两个类之间的另一个不同之处是,每个类中都有其他类中没有的方法。本质上,我想将这些方法拆分为两个使用相同名称但不同文件夹的单独文件。 理论上,我认为这是可能的,因为Java编译器在构建输出时确实维护了目录结构。所以在运行时,如果在类中调用了一个方法,Java可能会在任何一个文件中找到该方法。 这可能吗?我使用的是I

  • 问题内容: 拥有Java代码 该字符串将分配在相同的内存位置(或多倍): 是否多次启动同一程序(并行)执行? 可能的答案: 我目前是C#开发人员(尽管在上个千年中使用Java编程)。 我之所以问这个问题,是因为我相信.NET CLR和Java(JVM)之间是相同的,我希望得到.NET应用程序的答案(但由于经常遇到的“应用程序”池术语而引起疑问)。 答案是 字符串 实习生池由同一JVM或.NET C

  • 问题内容: 在Python中查看两个文件在内容方面是否相同的最简单方法是什么。 我可以做的一件事是对每个文件md5进行比较。有没有更好的办法? 问题答案: 是的,我认为如果必须比较多个文件并存储哈希以供以后比较,则对文件进行哈希处理将是最好的方法。由于哈希可能会发生冲突,因此可能会根据用例进行逐字节比较。 通常,逐字节比较将是足够且高效的,哪个filecmp模块也已经执行了其他操作。 参见http