在不解压的情况下,替换压缩包文件

假设需求是;将1.txt替换到Test.zip中test目录下。可以这样:

 public static void main(String[] args)
    {
        Path myFilePath = Paths.get("C:\\Users\\Administrator\\Desktop\\1.txt");
        Path zipFilePath = Paths.get("C:\\Users\\Administrator\\Desktop\\Test.zip");
        try (FileSystem fs = FileSystems.newFileSystem(zipFilePath, null))
        {
            Path fileInsideZipPath = fs.getPath("\\test\\1.txt");
            Files.copy(myFilePath, fileInsideZipPath, StandardCopyOption.REPLACE_EXISTING);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

但期间发现,如果压缩包里路径有中文一直复制不成功,经调试发现路径上的中文都是乱码。最后发现编码格式是GBK,可能每种压缩包的编码格式都不一样吧QAQ

所以在打开压缩包时需要设置一下编码格式为GBK即可:

public static void main(String[] args)
    {
        Path myFilePath = Paths.get("C:\\Users\\Administrator\\Desktop\\1.txt");
        Path zipFilePath = Paths.get("C:\\Users\\Administrator\\Desktop\\Test.zip");
        //windows下需要设置一下字符集
        Map<String, String> env = new HashMap<>();
        env.put("encoding", "GBK");
        try (ZipFileSystem fs = (ZipFileSystem) new ZipFileSystemProvider().newFileSystem(zipFilePath, env))
//        try (FileSystem fs = FileSystems.newFileSystem(zipFilePath, null))
        {
            Path fileInsideZipPath = fs.getPath("\\test\\1.txt");
            Files.copy(myFilePath, fileInsideZipPath, StandardCopyOption.REPLACE_EXISTING);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
要在不解缩的情况下替换zip压缩包中的指定文件,可以使用JavaZipFile和ZipOutputStream类。 首先,使用ZipFile读取原始Zip文件,并且使用ZipOutputStream创建一个新的Zip文件。然后,遍历ZipFile中的所有条目,并将所有条目写入新的ZipOutputStream中,除了要替换文件。当到达要替换文件时,使用ZipEntry将文件添加到新的ZipOutputStream中,以便替换原始文件。 以下是一个示例代码: ```java import java.io.*; import java.util.*; import java.util.zip.*; public class ReplaceZipFileEntry { public static void main(String[] args) throws Exception { String zipFileName = "example.zip"; String fileToReplace = "file.txt"; String replacementFileName = "replacement.txt"; // Open the original zip file and create a new one File zipFile = new File(zipFileName); File tempZipFile = new File("temp.zip"); ZipFile zip = new ZipFile(zipFile); ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tempZipFile)); // Loop through all the entries in the original zip file Enumeration entries = zip.entries(); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); // If this is the file to be replaced, add the replacement file instead if (entry.getName().equals(fileToReplace)) { File replacementFile = new File(replacementFileName); FileInputStream fis = new FileInputStream(replacementFile); zos.putNextEntry(new ZipEntry(entry.getName())); byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) > 0) { zos.write(buffer, 0, length); } fis.close(); } else { // Otherwise, copy the original entry to the new zip file zos.putNextEntry(entry); InputStream is = zip.getInputStream(entry); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { zos.write(buffer, 0, length); } is.close(); } } // Close the streams and delete the original zip file zos.close(); zip.close(); zipFile.delete(); // Rename the temporary zip file to the original name tempZipFile.renameTo(zipFile); } } ``` 在此示例中,我们将替换example.zip文件中名为file.txt的文件。我们使用replacement.txt文件替换它。在代码中,我们首先打开原始zip文件并创建一个新的zip文件(temp.zip)。然后,我们遍历原始zip文件中的所有条目,并将它们添加到新的zip文件中。如果我们到达要替换文件,我们使用ZipEntry添加replacement.txt文件。最后,我们关闭所有流,删除原始zip文件,并将临时zip文件重命名为原始zip文件的名称。 请注意,这种方法适用于仅替换一个或两个文件的情况。如果您需要替换多个文件,最好解缩整个zip文件替换所需的文件,然后重新缩整个zip文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树上灵溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值