首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java tar和gzip目录,但最终结果不是.tar.gz格式,结果只是一个常规文件

在使用Java进行tar和gzip压缩时,如果最终结果不是一个.tar.gz格式的文件,而是一个常规文件,可能是由于以下几个原因造成的:

  1. 压缩方法不正确:可能是在压缩过程中没有正确地将tar文件和gzip压缩结合起来。
  2. 文件流处理不当:在读写文件流时可能出现了问题,导致最终的文件不是预期的格式。
  3. 编码或字符集问题:在处理文件名或路径时,可能因为编码不一致导致文件名或路径出现问题。

解决方法

下面是一个使用Java进行tar和gzip压缩的正确示例代码:

代码语言:txt
复制
import java.io.*;
import org.apache.commons.compress.archivers.tar.*;
import org.apache.commons.compress.compressors.gzip.*;

public class TarGzipCompressor {
    public static void main(String[] args) {
        String sourceDir = "path/to/source/directory";
        String outputFileName = "output.tar.gz";

        try {
            File source = new File(sourceDir);
            FileOutputStream fos = new FileOutputStream(outputFileName);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            GzipCompressorOutputStream gzos = new GzipCompressorOutputStream(bos);
            TarArchiveOutputStream tarOS = new TarArchiveOutputStream(gzos);

            addFilesToTarGZ(source, "", tarOS);

            tarOS.finish();
            tarOS.close();
            gzos.close();
            bos.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void addFilesToTarGZ(File file, String parentPath, TarArchiveOutputStream tarOS) throws IOException {
        String entryName = parentPath + file.getName();
        TarArchiveEntry tarEntry = new TarArchiveEntry(file, entryName);
        tarOS.putArchiveEntry(tarEntry);

        if (file.isFile()) {
            try (FileInputStream fis = new FileInputStream(file)) {
                byte[] buffer = new byte[1024];
                int len;
                while ((len = fis.read(buffer)) != -1) {
                    tarOS.write(buffer, 0, len);
                }
            }
            tarOS.closeArchiveEntry();
        } else if (file.isDirectory()) {
            tarOS.closeArchiveEntry();
            File[] children = file.listFiles();
            if (children != null) {
                for (File child : children) {
                    addFilesToTarGZ(child, entryName + "/", tarOS);
                }
            }
        }
    }
}

解释

  1. 依赖:确保你的项目中包含了Apache Commons Compress库,可以通过Maven添加以下依赖:
  2. 依赖:确保你的项目中包含了Apache Commons Compress库,可以通过Maven添加以下依赖:
  3. 代码逻辑
    • 创建一个FileOutputStream来写入最终的.tar.gz文件。
    • 使用GzipCompressorOutputStream将输出流包装成gzip压缩流。
    • 使用TarArchiveOutputStream将gzip压缩流包装成tar归档流。
    • 递归地将文件和目录添加到tar归档中。
  • 注意事项
    • 确保所有文件和目录的路径正确。
    • 处理文件流时要注意关闭流,以避免资源泄漏。

参考链接

通过上述方法和代码示例,你应该能够正确地生成.tar.gz格式的文件。如果仍然遇到问题,请检查日志和异常信息,以便进一步诊断问题所在。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • tar 压缩中的易错项

    其原因是tar默认为相对路径,使用绝对路径的话就回报这个错,可以使用-P参数(注意大写)解决这个问题 [root@localhost test]# tar zcvf services_(date +%F-%H).tar.gz /etc/services tar: Removing leading `/’ from member names /etc/services //上边之所以会报这个错误是因为tar 默认压缩的文件为当前目录下的文件也就是相对路径,而不能用绝对路径 正确的方法: [root@localhost test]# tar zcvfP services_(date +%F-%H).tar.gz /etc/services tar: Removing leading `/’ from member names /etc/services //上边之所以会报这个错误是因为tar 默认压缩的文件为当前目录下的文件也就是相对路径,而不能用绝对路径 正确的方法: [root@localhost test]# tar zcvfP services_(date +%F-%H).tar.gz /etc/services tar: Removing leading `/’ from member names /etc/services //上边之所以会报这个错误是因为tar 默认压缩的文件为当前目录下的文件也就是相对路径,而不能用绝对路径 正确的方法: [root@localhost test]# tar zcvfP services_(date +%F-%H).tar.gz /etc/services 解释:加上P的原因是因为可以压缩绝对路径。

    02

    linux解压 tar命令

    因为不可能同时压缩与解压缩。 -z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩? -j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩? -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程! -f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!    例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成    『 tar -zcvPf tfile sfile』才对喔! -p :使用原文件的原来属性(属性不会依据使用者而变) -P :可以使用绝对路径来压缩! -N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中! –exclude FILE:在压缩的过程中,不要将 FILE 打包!

    04
    领券