java代码ant、compress压缩文件,并保留文件的可执行权限

 

第一种,通过ant进行压缩,并授权0755

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
	public static void write(File path, File zipFile) throws IOException {
		ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile));
		zip.setEncoding("GBK");
		Util.write(path, path, zip);
		zip.close();
	}
 
	private static void write(File base, File path, ZipOutputStream zip) throws IOException {
		URI rel = base.toURI().relativize(path.toURI());
		if (path.isDirectory()) {
			ZipEntry entry = new ZipEntry(rel.getPath());
			entry.setUnixMode(0755);
			zip.putNextEntry(entry);
			zip.closeEntry();
			File[] files = path.listFiles();
			for (File file : files) {
				write(base, file, zip);
			}
		} else {
			ZipEntry entry = new ZipEntry(rel.getPath());
			entry.setUnixMode(644);
			zip.putNextEntry(entry);
			FileInputStream is = new FileInputStream(path);
			zip.write(IOUtils.toByteArray(is));
			is.close();
			zip.closeEntry();
		}
	}

第二种,通过compress进行压缩,并授权0755

public class JdCompressUtil {

    public static void toZipWithoutDir(String srcDir, String targetFile)
            throws RuntimeException, FileNotFoundException {

        OutputStream out = new FileOutputStream(targetFile);

        File sourceFile = new File(srcDir);

        List<File> files = Arrays.asList(sourceFile.listFiles());

        files = files.stream().filter(file -> file.isFile()).collect(Collectors.toList());

        toZip(files, out);
    }

    /**
     * 压缩成ZIP 方法2
     *
     * @param srcFiles 需要压缩的文件列表
     * @param out      压缩文件输出流
     * @throws RuntimeException 压缩失败会抛出运行时异常
     */
    public static void toZip(List<File> srcFiles, OutputStream out) throws RuntimeException {
        long start = System.currentTimeMillis();
        ZipArchiveOutputStream zos = null;
        try {
            zos = new ZipArchiveOutputStream(out);
            for (File srcFile : srcFiles) {

                ZipArchiveEntry entry = new ZipArchiveEntry(srcFile.getName());

                entry.setUnixMode(0755);

                zos.putArchiveEntry(entry);

                FileInputStream in = new FileInputStream(srcFile);

                BufferedInputStream ins = new BufferedInputStream(new FileInputStream(srcFile.getAbsolutePath()));
                IOUtils.copy(ins, zos);

                zos.closeArchiveEntry();

                in.close();
            }
            long end = System.currentTimeMillis();
            System.out.println("压缩完成,耗时:" + (end - start) + " ms");
        } catch (Exception e) {
            throw new RuntimeException("zip error from ZipUtils", e);
        } finally {
            if (zos != null) {
                try {
                    zos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

这里很重要的一点,开始测试的时候使用的授权码setUnixMode为755,这里死活不生效,改成0755就好了

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码者人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值