我如何创建自己的zip文件?

时间:2015-03-23 12:45:26

标签: java zip

我希望能够创建一个像拉链一样的文件,但同时它不是一个真正的拉链。

假设我有一个程序,它会将一堆文件和目录存储到一个名为data.rds并扩展的文件中,您需要相同的程序将它们从中提取出来。我在许多不同的游戏中看到他们使用.arc.nsa.mxdl等文件格式,这些格式都存储了许多文件,.rar可能是最常见的格式。这四个扩展不能作为普通的zip打开,并且需要一个特定的程序才能从中提取文件,我想了解如何将多个文件加密和解密为一个文件而不使其可读就像它在普通的zip文件中一样。

几乎怎么会这样做呢?我知道这将是一个漫长的过程,并且不会用一些简单的代码来回答,但如果有人能指出我的方向来学习如何做这样的事情,那将有所帮助。

4 个答案:

答案 0 :(得分:1)

无论你发明什么样的格式,都会有人弄清楚。任何人都可以反编译您的代码并查看您的算法。

我只会使用Zip格式并为文件提供不同的扩展名(听起来就像你已经在做的那样)。让不经意的观察者打开你的文件的一个简单方法是在它的前面加上几个垃圾字节:

private static final byte[] secretSignature = { 10, 20 };

void writeData(Path file)
throws IOException {
    try (OutputStream out = new BufferedOutputStream(
            Files.newOutputStream(file))) {
        out.write(secretSignature);

        ZipOutputStream zip = new ZipOutputStream(out);
        // Write zip entries
        zip.finish();
    }
}

void readData(Path file)
throws IOException {
    try (InputStream in = new BufferedInputStream(
            Files.newInputStream(file))) {
        in.skip(secretSignature.length);

        ZipInputStream zip = new ZipInputStream(in);
        ZipEntry entry;
        while ((entry = zip.getNextEntry()) != null) {
            // Read entry
        }
    }
}

答案 1 :(得分:0)

你可以像这样接近它:

1)从一个简单的应用程序开始#34;将目录,文件列表......的内容存储在一个文件中。含义:学习如何收集所有这些文件;以及如何将它们推送到一个未压缩的存档(当然:确保您可以再次提取事物)

2)当该步骤正常工作时(并进行适当和广泛的测试);然后添加"压缩" RESP。 "减压"步。

您最喜欢的搜索引擎会在搜索"压缩算法时为您提供很多结果"。

答案 2 :(得分:0)

这取决于你的目标。

我会假设您希望编写自己的算法以获得乐趣。

如果你只想把东西打包在一起并加密它们,那么,只需要获取你需要的文件并以顺序的方式编写它们的二进制内容,在文件的开头加上类似索引表的东西,告诉你在哪里在大文件中,每个文件都会启动。然后使用您选择的算法加密所有内容。

如果你想压缩它们,我觉得建议你实现的最简单的算法是你的二进制内容的霍夫曼编码。请注意,虽然理论上足够简单,但实施起来仍然是一个非常严峻的考验,所以要仔细考虑它是否值得,或者你是否可以依赖现成的东西。

底线:如果你这样做是为了教自己一些东西,那就去吧。如果你需要在一个更大的项目中,最终目标不是学习这些东西,那就去做一些已经存在的事情。

答案 3 :(得分:0)

我觉得你更关心真实性,也就是说,档案没有被修改。我将进一步假设您并不真正想要实现自己的压缩算法。

话虽如此,你可以做到以下几点:

  1. 创建一个不同扩展名的zip。
  2. 计算文件的SHA1哈希值
  3. 使用SHA1哈希检查该档案是否未被更改。