ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

通过 Java 压缩文件,打包一个 tar.gz 采集器包

2019-11-05 18:51:47  阅读:259  来源: 互联网

标签:Java String tar commons 压缩文件 采集器 file TarArchiveOutputStream new


一、如何通过 Java 打包文件

1.1 添加 Maven 依赖

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.12</version>
</dependency>

 

1.2 打包核心代码

通过 Apachecompress 工具打包思路大致如下:

  • ①:创建一个 FileOutputStream 到输出文件(.tar.gz)文件。

  • ②:创建一个 GZIPOutputStream,用来包装 FileOutputStream对象。

  • ③:创建一个 TarArchiveOutputStream,用来包装 GZIPOutputStream对象。

  • ④:接着,读取文件夹中的所有文件。

  • ⑤:如果是目录,则将其添加到 TarArchiveEntry

  • ⑥:如果是文件,依然将其添加到 TarArchiveEntry 中,然后还需将文件内容写入 TarArchiveOutputStream 中。

 

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.util.zip.GZIPOutputStream; public class TarUtils {
  public static void compress(String sourceFolder, String tarGzPath) throws IOException {
createTarFile(sourceFolder, tarGzPath);
 }

    1. private static void createTarFile(String sourceFolder, String tarGzPath) {

    2. TarArchiveOutputStream tarOs = null;

    3. try {

    4. // 创建一个 FileOutputStream 到输出文件(.tar.gz)

    5. FileOutputStream fos = new FileOutputStream(tarGzPath);

    6. // 创建一个 GZIPOutputStream,用来包装 FileOutputStream 对象

    7. GZIPOutputStream gos = new GZIPOutputStream(new BufferedOutputStream(fos));

    8. // 创建一个 TarArchiveOutputStream,用来包装 GZIPOutputStream 对象

    9. tarOs = new TarArchiveOutputStream(gos);

    10. // 若不设置此模式,当文件名超过 100 个字节时会抛出异常,异常大致如下:

    11. // is too long ( > 100 bytes)

    12. // 具体可参考官方文档:http://commons.apache.org/proper/commons-compress/tar.html#Long_File_Names

    13. tarOs.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);

    14. addFilesToTarGZ(sourceFolder, "", tarOs);

    15. } catch (IOException e) {

    16. e.printStackTrace();

    17. }finally{

    18. try {

    19. tarOs.close();

    20. } catch (IOException e) {

    21. e.printStackTrace();

    22. }

    23. }

    24. }

    25.  

    26. public static void addFilesToTarGZ(String filePath, String parent, TarArchiveOutputStream tarArchive) throws IOException {

    27. File file = new File(filePath);

    28. // Create entry name relative to parent file path

    29. String entryName = parent + file.getName();

    30. // 添加 tar ArchiveEntry

    31. tarArchive.putArchiveEntry(new TarArchiveEntry(file, entryName));

    32. if (file.isFile()) {

    33. FileInputStream fis = new FileInputStream(file);

    34. BufferedInputStream bis = new BufferedInputStream(fis);

    35. // 写入文件

    36. IOUtils.copy(bis, tarArchive);

    37. tarArchive.closeArchiveEntry();

    38. bis.close();

    39. } else if (file.isDirectory()) {

    40. // 因为是个文件夹,无需写入内容,关闭即可

    41. tarArchive.closeArchiveEntry();

    42. // 读取文件夹下所有文件

    43. for (File f : file.listFiles()) {

    44. // 递归

    45. addFilesToTarGZ(f.getAbsolutePath(), entryName + File.separator, tarArchive);

    46. }

    47. }

    48. }

    49.  

    50. public static void main(String[] args) throws IOException {

    51. // 测试一波,将 filebeat-7.1.0-linux-x86_64 打包成名为 filebeat-7.1.0-linux-x86_64.tar.gz 的 tar 包

    52. compress("/Users/a123123/Work/filebeat-7.1.0-linux-x86_64", "/Users/a123123/Work/tmp_files/filebeat-7.1.0-linux-x86_64.tar.gz");

    53. }

    54.  

 

}


  

标签:Java,String,tar,commons,压缩文件,采集器,file,TarArchiveOutputStream,new
来源: https://www.cnblogs.com/kevin-ying/p/11800775.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有