`

支持Window和Linux下tar.gz文件压缩

 
阅读更多
最近做文件压缩,最后在Window下压缩解压后都可以,可是在Windows下压缩后到Linux下用命令解压(tar zxvf tarname.tar.gz -C unFolderName)就出现问题了,文件名包括在单独的文件中(05\foldername\file.txt)。

后来发现是压缩单独的文件时出错了,
TarArchiveEntry tae = new TarArchiveEntry(file, finalFileName);
这样写就出现了以上错误,改成以下一个参数的就可以了
TarArchiveEntry tae = new TarArchiveEntry(finalFileName);


另外就是,压缩文件夹和压缩单独文件分开



private void compressPerDayFolder(String currentDay) throws IOException,
      CompressorException {
    // prepare current need to compress day source file folder
    StringBuffer sourceFileDirPath = new StringBuffer(compressMonthDirPath)
        .append("/").append(currentDay);
    String sourceFileDirPathStr = sourceFileDirPath.toString().replace("/",
        File.separator);
    File sourceFileDir = new File(sourceFileDirPathStr);

    // prepare current Day directory for following use
    compressDayDirPath = sourceFileDirPathStr;
    compressDayDirPathLengthAddOne = sourceFileDirPathStr.length() + 1;

    // prepare current day finally compressed file
    StringBuffer targetFileName = new StringBuffer("snapshot_archive_")
        .append(compressYear).append(compressMonth).append(currentDay)
        .append(".tar.gz");
    StringBuffer targetFilePath = new StringBuffer(compressMonthDirPath)
        .append(File.separator).append(targetFileName);
    File targetFile = new File(targetFilePath.toString());

    if (sourceFileDir.isDirectory()) {
      File[] sourceFileArr = sourceFileDir.listFiles();

      // compress all files in this day folder
      packAndCompressSnapshotXmlFiles(sourceFileArr, targetFile);
    } else {
      getLogger().error("This is not folder: " + sourceFileDirPathStr);
    }
  }

private void packAndCompressSnapshotXmlFiles(File[] sourceFileArr,
      File targetFile) throws IOException,
      CompressorException {
    FileOutputStream fileOutputStream = null;
    CompressorOutputStream gzippedOut = null;
    TarArchiveOutputStream taos = null;

    try {
      fileOutputStream = FileUtils.openOutputStream(targetFile);

      gzippedOut = new CompressorStreamFactory().createCompressorOutputStream(
          CompressorStreamFactory.GZIP, fileOutputStream);

      taos = new TarArchiveOutputStream(gzippedOut);
      // iteration all files in this day folder to compress
      for (File hourDirFile : sourceFileArr) {
        compressSnapshotFolders(hourDirFile, taos);
      }
    } catch (IOException ioe) {
      throw ioe;
    } catch (CompressorException ce) {
      throw ce;
    } finally {
      if (taos != null) {
        try {
          taos.close();
        } catch (IOException e) {
        }
      }

      if (gzippedOut != null) {
        try {
          gzippedOut.close();
        } catch (IOException e) {
        }
      }
    }

  }

  private void compressSnapshotFolders(File file,
      TarArchiveOutputStream taos) throws IOException {
    if (file.isDirectory()) {
      parkAndCompressPerDir(file, taos);
      
      File[] subFileArr = file.listFiles();
      for (File subFile : subFileArr) {
        compressSnapshotFolders(subFile, taos);
      }
    } else {
      parkAndCompressPerFile(file, taos);
    }
  }

  private void parkAndCompressPerFile(File file, TarArchiveOutputStream taos)
      throws IOException {
    // substring the file name path(forget all before the day folder, not
    // including the day and file separator)
    String fileAbstPath = file.getAbsolutePath();
    String finalFileName = fileAbstPath.substring(fileAbstPath
        .indexOf(compressDayDirPath) + compressDayDirPathLengthAddOne);

    // this file will in this folders if the name string including
    // current operation system file separator
    TarArchiveEntry tae = new TarArchiveEntry(finalFileName);
    tae.setSize(file.length());
    taos.putArchiveEntry(tae);
    taos.write(FileUtils.readFileToByteArray(file));
    taos.closeArchiveEntry();
  }
  
  private void parkAndCompressPerDir(File file, TarArchiveOutputStream taos)
      throws IOException {
    // substring the file name path(forget all before the day folder, not
    // including the day and file separator)
    String fileAbstPath = file.getAbsolutePath();
    String finalFileName = fileAbstPath.substring(fileAbstPath
        .indexOf(compressDayDirPath) + compressDayDirPathLengthAddOne);

    // this file will in this folders if the name string including
    // current operation system file separator
    TarArchiveEntry tae = new TarArchiveEntry(finalFileName + File.separator);
    taos.putArchiveEntry(tae);
    taos.closeArchiveEntry();
  }
分享到:
评论

相关推荐

    libXcomposite-devel-0.4.4-4.1.el7.x64-86.rpm.tar.gz

    本文将详细介绍libXcomposite-devel-0.4.4-4.1.el7.x64-86.rpm.tar.gz这个文件包的内容、安装步骤和使用说明,帮助用户顺利安装和使用。 首先,libXcomposite-devel-0.4.4-4.1.el7.x64-86.rpm.tar.gz是一个压缩包,...

    mariadb-5.5.68.tar.gz

    这个“mariadb-5.5.68.tar.gz”文件是MariaDB 5.5.68版本的源码压缩包,采用gzip算法进行压缩,后缀为“.tar.gz”,意味着它是一个归档文件,可以包含多个文件和目录。SHA256哈希值“23FF96DB2215D3D2EB...

    x11-ssh-askpass-1.2.4.1.tar.gz

    1. **解压**:使用`tar -zxvf x11-ssh-askpass-1.2.4.1.tar.gz`命令解压缩文件。 2. **进入目录**:使用`cd x11-ssh-askpass-1.2.4.1`进入解压后的目录。 3. **配置**:运行`./configure`来检查系统环境并生成适合的...

    PyPI 官网下载 | embedded_window-0.0.1.tar.gz

    ".tar.gz"是Linux和Unix系统中常见的归档格式,用于打包多个文件或目录,而这里的.tar.gz文件则包含了解压后可以安装到Python环境中的源代码。 在Python中,我们通常使用pip工具来安装从PyPI下载的库。对于...

    libxext-1.3.4.tar.gz

    这种格式(.tar.gz)通常用于在 Linux 和类 Unix 系统中分发开源软件,因为它能有效地压缩文件。 **描述解析:**描述提到“libx11编译使用的libxext”,这表明 libxext 是作为 libx11 编译过程中的依赖库。libx11 ...

    cups-windows-6.0-source.tar.gz_cups_cups-windows

    这种格式在Unix/Linux环境中常见,用于打包和压缩文件。 描述中的“cups 6.0 opensource print management source”进一步确认了这是CUPS 6.0的开放源代码,主要用于打印管理。CUPS通过提供一套标准化的接口和机制...

    grads-2.0.2.oga.2-bundle-x86_64-unknown-linux-gnu.tar.gz

    `.tar.gz`是一种常见的文件打包格式,由`tar`用于归档多个文件,然后用`gzip`进行压缩。在Linux环境下,可以使用以下命令来解压: ```bash tar -zxvf grads-2.0.2.oga.2-bundle-x86_64-unknown-linux-gnu.tar.gz ``...

    CHNTEL_Linux_UI.tar.gz

    标题“CHNTEL_Linux_UI.tar.gz”表明这是一个与Linux用户界面相关的压缩文件,采用了常见的归档格式“tar.gz”。这种格式是Linux和Unix系统中广泛使用的,它结合了tar(用于打包多个文件和目录)和gzip(用于压缩...

    poppler-poppler-0.83.0.tar.gz官方git版本下载

    "tar.gz"是常见的归档和压缩格式,它首先使用tar工具将所有文件打包成一个大文件,然后使用gzip进行压缩,以减少存储空间。 描述中的"No package 'poppler-glib' found"是一个错误提示,意味着在系统中找不到名为...

    gcc-11.4.0.tar.gz

    GCC源码包,如gcc-11.4.0.tar.gz,不仅是一个简单的压缩文件,它是开源世界中的一个基石,为软件开发提供着强大而稳定的编译支持。无论对于普通用户还是专业开发者,GCC都是学习和掌握编程技能不可或缺的工具之一。

    winutils.tar.gz

    标题“winutils.tar.gz”指的是一个包含winutils工具的压缩文件,这个工具是专门为Windows环境设计的,主要用于支持Apache Spark的运行和调试。在Spark的工作流程中,winutils.exe扮演了重要的角色,尤其是在Hadoop...

    word2vec.tar.gz 源码 安装文件

    2. **解压文件**:使用解压工具(如tar命令在Linux系统中)解压缩文件,例如:`tar -zxvf word2vec-2014-10-29.tar.gz`。 3. **进入源码目录**:解压后,进入源代码目录,例如:`cd word2vec-2014-10-29`。 4. **...

    Mycat-server-1.6.7.6-release-windows-linux.rar

    在实际操作中,用户需要先解压缩文件,然后在对应的操作系统上运行相应的安装程序,如在Windows环境下运行".tar.gz"文件,而在Linux环境下则需运行相同版本的".tar.gz"文件。 标签中的"mysql"和"mycat"提示我们,...

    xorg-x11-util-macros-1.19.0-3.el7.x64-86.rpm.tar.gz

    tar.gz是一种在Unix和类Unix系统中广泛使用的文件压缩格式,常用于打包多个文件和目录,以便于传输和备份。该包可能包含了多个RPM文件,这些文件通常是依赖关系较为紧密的软件包集合,以确保软件的正常安装和运行。 ...

    ace-window_0.9.0.orig.tar.gz

    最后,".orig.tar.gz"是打包和压缩的格式,说明原始源代码被收集到一个tar档案中,并使用gzip进行压缩,这通常是Linux或类Unix系统中开源软件分发的标准做法。 描述中的"统信UOSdeb包"暗示了这个软件是为统信UOS...

    inputproto-2.2.tar.gz

    1. `tar -zxvf inputproto-2.2.tar.gz`:解压缩文件。 2. `cd inputproto-2.2`:进入源码目录。 3. `./configure`:配置源码,检查系统环境并生成Makefile。 4. `make`:编译源码。 5. `sudo make install`:将编译...

    libXScrnSaver-devel-1.2.2-6.1.el7.x64-86.rpm.tar.gz

    在处理以tar.gz为后缀的压缩包时,我们通常会接触到Linux系统下的软件包管理。本文所涉及的压缩包文件名为"libXScrnSaver-devel-1.2.2-6.1.el7.x64-86.rpm.tar.gz",这表明其内部包含了多个rpm格式的软件包以及可能...

    Android Studio Koala(android-studio-2024.1.2.12-linux.zip.002)

    Android Studio Koala Feature Drop 2024.1.2(android-studio-2024.1.2.12-linux.tar.gz)适用于Linux系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: ...

    windows下tar打包软件_TAR压缩解压

    在Windows操作系统中,通常我们使用的压缩和解压缩工具是如WinRAR或7-Zip这样的软件,但有时我们可能需要处理Linux环境下产生的`.tar`格式文件。`.tar`文件是一种非常常见的档案格式,它主要用于组合多个文件和目录...

    xpm.tar.gz_fbida_xpm tar

    总的来说,"xpm.tar.gz_fbida_xpm tar"涉及到的技术点包括:`.tar`和`.gz`文件格式,用于数据打包和压缩;`fbida`,一套终端下的图形工具,尤其适用于无GUI环境;以及XPM图像格式,适合在文本界面展示图像。理解这些...

Global site tag (gtag.js) - Google Analytics