1. <dependency>
    2. <groupId>org.apache.ant</groupId>
    3. <artifactId>ant</artifactId>
    4. <version>1.9.7</version>
    5. </dependency>

    这里得再添加一下

    1. import lombok.experimental.UtilityClass;
    2. import org.apache.commons.io.FileUtils;
    3. import org.apache.tools.tar.TarEntry;
    4. import org.apache.tools.tar.TarOutputStream;
    5. import java.io.*;
    6. import java.util.zip.GZIPOutputStream;
    7. /**
    8. * @author shizi
    9. * @since 2020/4/30 1:47 PM
    10. */
    11. @UtilityClass
    12. public class TarUtils {
    13. /**
    14. * 将对应的文件压缩为tar.gz格式
    15. *
    16. * @param inputFilePath xxx/file
    17. * @param targetFileName xxx/file.tar.gz
    18. */
    19. public void compress(String inputFilePath, String targetFileName) {
    20. TarOutputStream out = getTarOutputStream(targetFileName);
    21. File inputFile = new File(inputFilePath);
    22. tarPack(out, inputFile, inputFile.getName());
    23. try {
    24. if (null != out) {
    25. out.close();
    26. }
    27. } catch (IOException e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. private TarOutputStream getTarOutputStream(String targetFileName) {
    32. FileOutputStream fileOutputStream = null;
    33. File path = new File(targetFileName).getParentFile();
    34. FileOutputStream fos = null;
    35. GZIPOutputStream gos = null;
    36. if (!path.exists()) {
    37. path.mkdirs();
    38. }
    39. try {
    40. fos = new FileOutputStream(targetFileName);
    41. gos = new GZIPOutputStream(new BufferedOutputStream(fos));
    42. } catch (Throwable e) {
    43. System.err.println(e.getMessage());
    44. }
    45. TarOutputStream out = new TarOutputStream(gos);
    46. // 如果不加下面这段,当压缩包中的路径字节数超过100 byte时,就会报错
    47. out.setLongFileMode(TarOutputStream.LONGFILE_GNU);
    48. return out;
    49. }
    50. private void tarPack(TarOutputStream out, File inputFile, String base) {
    51. if (inputFile.isDirectory()) {
    52. packFolder(out, inputFile, base);
    53. } else {
    54. packFile(out, inputFile, base);
    55. }
    56. }
    57. private void packFolder(TarOutputStream out, File inputFile, String base) {
    58. File[] fileList = inputFile.listFiles();
    59. try {
    60. // 在打包文件中添加路径
    61. out.putNextEntry(new org.apache.tools.tar.TarEntry(base + "/"));
    62. } catch (IOException e) {
    63. System.err.println(e.getMessage());
    64. }
    65. base = base.length() == 0 ? "" : base + "/";
    66. assert fileList != null;
    67. for (File file : fileList) {
    68. tarPack(out, file, base + file.getName());
    69. }
    70. }
    71. private void packFile(TarOutputStream out, File inputFile, String base) {
    72. TarEntry tarEntry = null;
    73. try {
    74. //getBytes必须设置编码,否则会导致编码错误;
    75. tarEntry = new TarEntry(new String(base.getBytes("GBK"), "ISO-8859-1"));
    76. } catch (UnsupportedEncodingException e1) {
    77. System.err.println(e1.getMessage());
    78. }
    79. // 设置打包文件的大小,如果不设置,打包有内容的文件时,会报错
    80. tarEntry.setSize(inputFile.length());
    81. try {
    82. out.putNextEntry(tarEntry);
    83. } catch (IOException e) {
    84. System.err.println(e.getMessage());
    85. }
    86. try {
    87. byte[] wBuf = FileUtils.readFileToByteArray(inputFile);
    88. out.write(wBuf);
    89. } catch (IOException | NullPointerException e) {
    90. e.printStackTrace();
    91. } finally {
    92. try {
    93. out.closeEntry();
    94. } catch (IOException e) {
    95. e.printStackTrace();
    96. }
    97. }
    98. }
    99. }
    1. @Test
    2. public void test1(){
    3. TarUtils.compress("/Users/zhouzhenyong/tem/project/walle", "/Users/zhouzhenyong/tem/project/walle/test.tar.gz");
    4. }

    参考:
    代码借鉴:https://blog.csdn.net/luchaofang/article/details/88698038