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

如何用Java创建一个. tar.gz文件,保持相同的文件夹/目录结构

东郭兴学
2023-03-14

我希望创建一个.tar。以下文件夹/目录结构的gz文件,同时保留相同的文件夹/目录

ParentDir\
    ChildDir1\
        -file1
    ChildDir2\
        -file2
        -file3
    ChildDir3\
        -file4
        -file5

然而,我只能创建所有文件的. tar.gz,没有文件夹/目录结构。即:ParentDir.tar.gz

    ParentDir\
        -file1
        -file2
        -file3
        -file4
        -file5

使用Compress目录中用户接受的答案tar.gzCommons Compress,我有以下代码:

public void exportStaticFilesTar(String appID) throws, Exception {
        
        FileOutputStream fOut = null;
        BufferedOutputStream bOut = null;
        GzipCompressorOutputStream gzOut = null;
        TarArchiveOutputStream tOut = null;

        try {
            String filename = "ParentDir.tar.gz"

            //"parent/childDirToCompress/"
            String path = "<path to ParentDir>";

            fOut = new FileOutputStream(new File(filename));
            bOut = new BufferedOutputStream(fOut);
            gzOut = new GzipCompressorOutputStream(bOut);
            tOut = new TarArchiveOutputStream(gzOut);
            
            addFileToTarGz(tOut, path, "");
        } catch (Exception e) {
            log.error("Error creating .tar.gz: " +e);
        } finally {
            tOut.finish();
            tOut.close();
            gzOut.close();
            bOut.close();
            fOut.close();
        }
        
        //Download the file locally
        
    }

    private void addFileToTarGz(TarArchiveOutputStream tOut, String path, String base) throws IOException {
        File f = new File(path);
        String entryName = base + f.getName();
        TarArchiveEntry tarEntry = new TarArchiveEntry(f, entryName);
        tOut.putArchiveEntry(tarEntry);
        if (f.isFile()) {
            IOUtils.copy(new FileInputStream(f), tOut);
            tOut.closeArchiveEntry();
        } else {
            tOut.closeArchiveEntry();
            File[] children = f.listFiles();
            if (children != null) {
                for (File child : children) {
                    addFileToTarGz(tOut, child.getAbsolutePath(), entryName + "/");
                }
            }
        }
    }

有人可以建议,我如何修改当前代码以保留文件夹/目录结构,以创建.tar.gz文件。谢谢!

共有2个答案

公英哲
2023-03-14

使用请求中提到的代码,我能够在我的linux系统上生成一个成功的压缩文件。

您可以通过更改用户路径和需要压缩的根文件夹来进行复制。

public static void createTarGZ() throws FileNotFoundException, IOException
    {
        String sourceDirectoryPath = null;
        String destinationTarGzPath = null;
        FileOutputStream fileOutputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        GzipCompressorOutputStream gzOutpuStream = null;
        TarArchiveOutputStream tarArchiveOutputStream = null;

        String basePath = "/home/saad/CompressionTest/";

        try
        {

            sourceDirectoryPath = basePath + "asterisk";
            destinationTarGzPath = basePath + "asterisk.tar.gz";

            fileOutputStream = new FileOutputStream(new File(destinationTarGzPath));
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            gzOutpuStream = new GzipCompressorOutputStream(bufferedOutputStream);
            tarArchiveOutputStream = new TarArchiveOutputStream(gzOutpuStream);

            addFileToTarGz(tarArchiveOutputStream, sourceDirectoryPath, "");
        }
        finally
        {
            tarArchiveOutputStream.finish();
            tarArchiveOutputStream.close();
            gzOutpuStream.close();
            bufferedOutputStream.close();
            fileOutputStream.close();
        }
    }

    private static void addFileToTarGz(TarArchiveOutputStream tarOutputStream, String path, String base) throws IOException
    {
        File fileToCompress = new File(path);

        String entryName = base + fileToCompress.getName();

        TarArchiveEntry tarEntry = new TarArchiveEntry(fileToCompress, entryName);

        tarOutputStream.putArchiveEntry(tarEntry);

        // If its a file, simply add it
        if (fileToCompress.isFile())
        {
            IOUtils.copy(new FileInputStream(fileToCompress), tarOutputStream);
            tarOutputStream.closeArchiveEntry();
        }
        // If its a folder then add all its contents
        else
        {
            tarOutputStream.closeArchiveEntry();
            File[] children = fileToCompress.listFiles();

            if (children != null)
            {
                // add every file/folder recursively to the tar
                for (File child : children)
                {
                    addFileToTarGz(tarOutputStream, child.getAbsolutePath(), entryName + "/");
                }
            }
        }
    }
秦凯定
2023-03-14

我通过以下方式相处得更好。重要提示:您需要将正确的初始值作为基础传递,该值是树中的第一个目录(不包括fs根):

    private void addFileToTarGz(TarArchiveOutputStream tOut, String path, String base) throws IOException {
        File f = new File(path);
        String entryName = base + File.separatorChar + f.getName();
        TarArchiveEntry tarEntry = new TarArchiveEntry(f, entryName);
        tOut.putArchiveEntry(tarEntry);
        if (f.isFile()) {
            IOUtils.copy(new FileInputStream(f), tOut);
            tOut.closeArchiveEntry();
        } else {
            tOut.closeArchiveEntry();
            File[] children = f.listFiles();
            if (children != null) {
                for (File child : children) {
                    addFileToTarGz(tOut, child.getAbsolutePath(), entryName);
                }
            }
        }
    }
 类似资料:
  • 问题内容: 是否存在在Java应用程序中创建临时目录的标准可靠方法?Java的问题数据库中有一个条目,注释中包含一些代码,但是我想知道在一个常用的库(Apache Commons等)中是否可以找到一种标准的解决方案? 问题答案: 如果你使用的是JDK 7,请使用新的Files.createTempDirectory类创建临时目录。 在JDK 7之前,应该这样做: 如果需要,可以提出更好的异常(IO

  • 本文向大家介绍Java如何在不存在文件夹的目录下创建文件,包括了Java如何在不存在文件夹的目录下创建文件的使用技巧和注意事项,需要的朋友参考一下 核心代码如下所示: 1、 2、 总结 以上所述是小编给大家介绍的Java如何在不存在文件夹的目录下创建文件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 前言 这一篇,我们将接着上篇来完成创建项目文件、目录结构。 回顾 先回顾一下现在项目有哪些东西了: . ├── app │   ├── app.vue │   ├── common │   │   ├── img │   │   ├── js │   │   └── scss │   ├── index.html │   ├── index.js │   ├── router

  • 问题内容: 如果我选择一个zip文件,然后右键单击“在此处提取”,则会创建一个包含zip文件名的文件夹,并将zip文件的全部内容提取到其中。 但是,我想通过外壳转换几个zip文件。但是当我这样做 该文件夹未创建,但所有文件都提取到当前目录中。 我看过参数,但是没有这样的参数。我也试过 但是2. $ zipfile和4. $ zipfile 的扩展名必须使用sed删除。如果我做 它不起作用。 如何正

  • 我在同一个文件夹中有数千个csv文件名,如下file_x_x.csv,其中x是1到10000之间的数字。每个文件包括一个标题和一行数据: file_1_1.csv 我的方法: 我不知道如何在最后创建一个唯一的文件。你能看一下上面的代码并告诉我如何获得所需的输出吗?如果我错过了什么?

  • 我试图复制文件从一个文件夹到另一个文件夹使用古普: 以上代码是复制 如果我用它会将所有css文件复制到文件夹,这不是我想要的。 如何选择多个文件并保持文件夹结构?