JAVA主流压缩解压工具对比、用法与选取

news2024/11/27 6:31:28

一、JAVA主流压缩工具

  1. java.util.zip:

    **说明:**Java标准库提供的压缩与解压功能,包含在java.util.zip包中。通过ZipInputStreamZipOutputStream可以实现ZIP格式的压缩与解压缩操作。

    适用场景: 适合简单的ZIP格式压缩与解压缩操作,可用于对单个文件或目录进行压缩和解压缩。

  2. Apache Commons Compress:

    **说明:**Apache Commons Compress是Apache软件基金会提供的开源压缩与解压工具包,支持多种压缩格式,包括ZIP、Gzip、Tar等。通过该工具包,可以进行更复杂的压缩与解压缩操作。

    **适用场景:**支持多种压缩格式,如ZIP、Gzip、Tar等,适合复杂的压缩与解压缩操作,可用于处理各种压缩格式和对多个文件或目录进行打包、解压缩。

  3. Java Zip4j:

    **说明:**Zip4j是一个开源的Java库,提供了对ZIP格式的支持,并且支持密码保护、分卷压缩等功能。

    **适用场景:**支持ZIP格式,提供了一些高级功能,如密码保护、分卷压缩等,适合复杂的ZIP格式的压缩与解压缩操作。

  4. LZ4:

    **说明:**LZ4是一种高性能的压缩算法,具有快速的压缩和解压缩速度,但压缩比相对较低。

    **适用场景:**适合对大量数据进行实时压缩和解压缩,例如在网络传输或大数据处理中,追求较高的压缩/解压缩速度。

  5. Snappy

    **说明:**Snappy是一种快速的压缩和解压缩算法,具有较快的压缩和解压缩速度,适合高性能场景。

    **适用场景:**适用于对大规模数据进行实时压缩和解压缩,例如在大数据处理和分析中。

这些压缩与解压工具可以根据项目的需求和使用场景选择合适的工具进行压缩与解压缩操作。Java标准库的java.util.zip包通常适用于简单的ZIP格式压缩与解压缩,Apache Commons Compress和Java Zip4j提供了更多的压缩格式和功能选项。对于大型数据集和高性能要求的场景,还可以考虑使用专门的压缩工具或算法,如LZ4、Snappy等。

二、压缩与解压用法

  1. java.util.zip的使用

    import java.io.*;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    public class JavaUtilZipDemo {
    
        /**
         * 使用java.util.zip库进行文件压缩
         *
         * @param inputFile  要压缩的文件或目录
         * @param outputFile 压缩后的文件
         * @throws IOException 压缩过程中可能出现的异常
         */
        public static void zipCompress(File inputFile, File outputFile) throws IOException {
            // 创建输出流写入压缩后的文件
            try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outputFile))) {
                // 判断要压缩的是文件还是目录
                if (inputFile.isFile()) {
                    // 压缩文件
                    zipFile(inputFile, zos, "");
                } else if (inputFile.isDirectory()) {
                    // 压缩目录
                    zipDir(inputFile, zos, "");
                }
            }
        }
    
        /**
         * 递归压缩目录及其子目录和文件
         *
         * @param dir   要压缩的目录
         * @param zos   压缩输出流
         * @param entry 压缩实体
         * @throws IOException 压缩过程中可能出现的异常
         */
        private static void zipDir(File dir, ZipOutputStream zos, String entry) throws IOException {
            // 获取目录中的文件和子目录
            File[] files = dir.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isFile()) {
                        // 压缩文件
                        zipFile(file, zos, entry + file.getName());
                    } else if (file.isDirectory()) {
                        // 压缩子目录
                        zipDir(file, zos, entry + file.getName() + "/");
                    }
                }
            }
        }
    
        /**
         * 压缩文件
         *
         * @param file  要压缩的文件
         * @param zos   压缩输出流
         * @param entry 压缩实体
         * @throws IOException 压缩过程中可能出现的异常
         */
        private static void zipFile(File file, ZipOutputStream zos, String entry) throws IOException {
            // 创建压缩实体并设置实体名称
            ZipEntry zipEntry = new ZipEntry(entry);
            // 将压缩实体写入压缩输出流
            zos.putNextEntry(zipEntry);
    
            // 创建输入流读取文件内容,并将内容写入压缩输出流
            try (FileInputStream fis = new FileInputStream(file)) {
                byte[] buffer = new byte[1024];
                int length;
                while ((length = fis.read(buffer)) > 0) {
                    zos.write(buffer, 0, length);
                }
            }
    
            // 关闭当前压缩实体
            zos.closeEntry();
        }
    
        /**
         * 使用java.util.zip库进行文件解压缩
         *
         * @param inputFile 压缩文件
         * @param outputDir 解压后的目录
         * @throws IOException 解压过程中可能出现的异常
         */
        public static void zipDecompress(File inputFile, File outputDir) throws IOException {
            // 创建输入流读取压缩文件
            try (ZipInputStream zis = new ZipInputStream(new FileInputStream(inputFile))) {
                // 遍历压缩文件中的实体
                ZipEntry zipEntry;
                while ((zipEntry = zis.getNextEntry()) != null) {
                    // 获取实体的名称
                    String entryName = zipEntry.getName();
                    // 创建输出文件并设置输出目录
                    File outputFile = new File(outputDir, entryName);
    
                    // 如果实体是目录,则创建相应目录;否则创建输出文件并写入数据
                    if (zipEntry.isDirectory()) {
                        outputFile.mkdirs();
                    } else {
                        try (FileOutputStream fos = new FileOutputStream(outputFile)) {
                            // 将输入流的数据写入输出文件
                            byte[] buffer = new byte[1024];
                            int length;
                            while ((length = zis.read(buffer)) > 0) {
                                fos.write(buffer, 0, length);
                            }
                        }
                    }
    
                    // 关闭当前解压实体
                    zis.closeEntry();
                }
            }
        }
    
        public static void main(String[] args) {
            try {
                File inputFile = new File("input");
                File outputFile = new File("output.zip");
                File outputDir = new File("output");
    
                // 压缩文件或目录
                zipCompress(inputFile, outputFile);
    
                // 解压缩文件
                zipDecompress(outputFile, outputDir);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
  2. Apache Commons Compress的使用

    import org.apache.commons.compress.archivers.ArchiveEntry;
    import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
    import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
    import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
    import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
    import org.apache.commons.compress.utils.IOUtils;
    
    import java.io.*;
    
    public class CommonsCompressUtil {
        /**
         * 使用 Apache Commons Compress 库进行Gzip压缩
         *
         * @param inputFile  要压缩的文件
         * @param outputFile 压缩后的文件
         * @throws IOException 压缩过程中可能出现的异常
         */
        public static void gzipCompress(File inputFile, File outputFile) throws IOException {
            // 创建输入流读取要压缩的文件
            try (FileInputStream fis = new FileInputStream(inputFile);
                 // 创建压缩输出流写入压缩后的文件
                 GzipCompressorOutputStream gzos = new GzipCompressorOutputStream(new FileOutputStream(outputFile))) {
                // 将输入流的数据压缩并写入输出流
                IOUtils.copy(fis, gzos);
            }
        }
    
        /**
         * 使用 Apache Commons Compress 库进行Gzip解压缩
         *
         * @param inputFile  压缩文件
         * @param outputFile 解压后的文件
         * @throws IOException 解压过程中可能出现的异常
         */
        public static void gzipDecompress(File inputFile, File outputFile) throws IOException {
            // 创建输入流读取压缩文件
            try (GzipCompressorInputStream gzis = new GzipCompressorInputStream(new FileInputStream(inputFile));
                 // 创建输出流写入解压后的文件
                 FileOutputStream fos = new FileOutputStream(outputFile)) {
                // 将输入流的数据解压并写入输出流
                IOUtils.copy(gzis, fos);
            }
        }
    
        /**
         * 使用 Apache Commons Compress 库进行Tar压缩
         *
         * @param inputFiles 要压缩的文件列表
         * @param outputFile 压缩后的文件
         * @throws IOException 压缩过程中可能出现的异常
         */
        public static void tarCompress(File[] inputFiles, File outputFile) throws IOException {
            // 创建压缩输出流写入压缩后的文件
            try (TarArchiveOutputStream taros = new TarArchiveOutputStream(new FileOutputStream(outputFile))) {
                // 设置压缩格式为gzip
                taros.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
    
                // 遍历要压缩的文件列表
                for (File inputFile : inputFiles) {
                    // 创建压缩实体并设置文件名
                    ArchiveEntry entry = taros.createArchiveEntry(inputFile, inputFile.getName());
                    // 将实体写入压缩输出流
                    taros.putArchiveEntry(entry);
    
                    // 创建输入流读取要压缩的文件
                    try (FileInputStream fis = new FileInputStream(inputFile)) {
                        // 将输入流的数据写入压缩输出流
                        IOUtils.copy(fis, taros);
                    }
    
                    // 关闭当前压缩实体
                    taros.closeArchiveEntry();
                }
            }
        }
    
        /**
         * 使用 Apache Commons Compress 库进行Tar解压缩
         *
         * @param inputFile   压缩文件
         * @param outputDir   解压后的目录
         * @throws IOException 解压过程中可能出现的异常
         */
        public static void tarDecompress(File inputFile, File outputDir) throws IOException {
            // 创建输入流读取压缩文件
            try (TarArchiveInputStream taris = new TarArchiveInputStream(new FileInputStream(inputFile))) {
                // 遍历压缩文件中的实体
                ArchiveEntry entry;
                while ((entry = taris.getNextEntry()) != null) {
                    // 获取实体的文件名
                    String fileName = entry.getName();
                    // 创建输出文件并设置输出目录
                    File outputFile = new File(outputDir, fileName);
    
                    // 如果实体是目录,则创建相应目录;否则创建输出文件并写入数据
                    if (entry.isDirectory()) {
                        outputFile.mkdirs();
                    } else {
                        try (FileOutputStream fos = new FileOutputStream(outputFile)) {
                            // 将输入流的数据写入输出文件
                            IOUtils.copy(taris, fos);
                        }
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            try {
                File inputFile = new File("input.txt");
                File gzipFile = new File("output.gz");
                File outputFile = new File("output.txt");
                File[] tarInputFiles = {new File("file1.txt"), new File("file2.txt")};
                File tarFile = new File("output.tar");
    
                // Gzip压缩
                gzipCompress(inputFile, gzipFile);
    
                // Gzip解压缩
                gzipDecompress(gzipFile, outputFile);
    
                // Tar压缩
                tarCompress(tarInputFiles, tarFile);
    
                // Tar解压缩
                tarDecompress(tarFile, new File("outputDir"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
  3. Zip4j使用:

    import net.lingala.zip4j.ZipFile;
    import net.lingala.zip4j.exception.ZipException;
    import net.lingala.zip4j.model.ZipParameters;
    import net.lingala.zip4j.util.Zip4jConstants;
    
    import java.io.File;
    
    public class Zip4jUtil {
        public static void compress(String sourceDir, String zipFile, String password) throws ZipException {
            // 创建 ZipFile 对象,指定要生成的压缩文件
            ZipFile zip = new ZipFile(zipFile);
            
            // 设置压缩参数
            ZipParameters parameters = new ZipParameters();
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 设置压缩方法
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 设置压缩级别
            if (password != null && !password.isEmpty()) {
                parameters.setEncryptFiles(true); // 设置是否加密文件
                parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 设置加密方法
                parameters.setPassword(password); // 设置密码
            }
            
            // 添加要压缩的文件或文件夹
            File sourceFile = new File(sourceDir);
            zip.addFolder(sourceFile, parameters);
        }
    
        public static void decompress(String zipFile, String destDir, String password) throws ZipException {
            // 创建 ZipFile 对象,指定要解压缩的文件
            ZipFile zip = new ZipFile(zipFile);
            
            // 设置解压密码(如果有)
            if (password != null && !password.isEmpty()) {
                if (zip.isEncrypted()) {
                    zip.setPassword(password);
                } else {
                    throw new ZipException("压缩文件未加密,请检查密码设置。");
                }
            }
            
            // 解压缩文件到指定目录
            zip.extractAll(destDir);
        }
    
        public static void main(String[] args) {
            try {
                String sourceDir = "source_directory";
                String zipFile = "compressed.zip";
                String destDir = "destination_directory";
                String password = "123456"; // 设置压缩密码,如果不需要加密可以设为null或空字符串
    
                // 压缩
                compress(sourceDir, zipFile, password);
    
                // 解压缩
                decompress(zipFile, destDir, password);
            } catch (ZipException e) {
                e.printStackTrace();
            }
        }
    }
    
    
  4. LZ4的使用:

    import net.jpountz.lz4.*;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    
    public class LZ4Util {
        /**
         * 使用 LZ4 算法压缩数据
         *
         * @param data 要压缩的数据
         * @return 压缩后的数据
         * @throws IOException 压缩过程中可能出现的异常
         */
        public static byte[] compress(byte[] data) throws IOException {
            // 获取 LZ4 算法的压缩器
            LZ4Compressor compressor = LZ4Factory.fastestInstance().fastCompressor();
    
            // 计算压缩后的数据最大长度
            int maxCompressedLength = compressor.maxCompressedLength(data.length);
    
            // 创建一个缓冲区用于存储压缩后的数据
            byte[] compressedData = new byte[maxCompressedLength];
    
            // 进行压缩,并获取压缩后的数据长度
            int compressedLength = compressor.compress(data, 0, data.length, compressedData, 0);
    
            // 根据实际压缩后的数据长度,创建一个新的数组来存储压缩后的数据
            byte[] result = new byte[compressedLength];
            System.arraycopy(compressedData, 0, result, 0, compressedLength);
    
            return result;
        }
    
        /**
         * 使用 LZ4 算法解压数据
         *
         * @param compressedData 压缩后的数据
         * @param originalLength 原始数据的长度
         * @return 解压后的数据
         * @throws IOException 解压过程中可能出现的异常
         */
        public static byte[] decompress(byte[] compressedData, int originalLength) throws IOException {
            // 获取 LZ4 算法的解压缩器
            LZ4FastDecompressor decompressor = LZ4Factory.fastestInstance().fastDecompressor();
    
            // 创建一个新的数组,用于存储解压后的数据
            byte[] result = new byte[originalLength];
    
            // 进行解压缩
            decompressor.decompress(compressedData, 0, result, 0, originalLength);
    
            return result;
        }
    
        public static void main(String[] args) {
            try {
                String inputString = "Hello, LZ4 compression!";
                byte[] inputData = inputString.getBytes();
    
                // 压缩
                byte[] compressedData = compress(inputData);
    
                // 解压缩
                byte[] decompressedData = decompress(compressedData, inputData.length);
    
                System.out.println("原始数据:" + inputString);
                System.out.println("压缩后数据:" + new String(compressedData));
                System.out.println("解压缩后数据:" + new String(decompressedData));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
  5. Snappy的使用

    import org.xerial.snappy.Snappy;
    
    import java.io.IOException;
    
    public class SnappyUtil {
        /**
         * 使用 Snappy 算法压缩数据
         *
         * @param data 要压缩的数据
         * @return 压缩后的数据
         * @throws IOException 压缩过程中可能出现的异常
         */
        public static byte[] compress(byte[] data) throws IOException {
            // 调用 Snappy 的压缩方法进行数据压缩
            return Snappy.compress(data);
        }
    
        /**
         * 使用 Snappy 算法解压数据
         *
         * @param compressedData 压缩后的数据
         * @return 解压后的数据
         * @throws IOException 解压过程中可能出现的异常
         */
        public static byte[] decompress(byte[] compressedData) throws IOException {
            // 调用 Snappy 的解压方法进行数据解压缩
            return Snappy.uncompress(compressedData);
        }
    
        public static void main(String[] args) {
            try {
                String inputString = "Hello, Snappy compression!";
                byte[] inputData = inputString.getBytes();
    
                // 压缩
                byte[] compressedData = compress(inputData);
    
                // 解压缩
                byte[] decompressedData = decompress(compressedData);
    
                System.out.println("原始数据:" + inputString);
                System.out.println("压缩后数据:" + new String(compressedData));
                System.out.println("解压缩后数据:" + new String(decompressedData));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    

三、综合比较与选取

压缩算法原始数据大小压缩后数据大小解压缩次数耗时(ms)
common-compress(bzip2)3260586100002361/2852/2676/2138
gzip326059010000171/163/152/146/148
lz4326011031000061/60/62/73/63
snappy326010561000036/39/33/33/33

总结以上工具的特点如下:

  1. java.util.zip:Java标准库提供的压缩与解压工具,使用简单方便,适用于基本的压缩与解压需求,但性能较其他库稍逊。
  2. Apache Commons Compress:功能丰富的开源压缩库,支持多种压缩格式,包括zip、tar、gzip、bzip2等,适用于处理各种类型的压缩文件,性能较好。
  3. Zip4j:基于java.util.zip的封装库,提供更便捷的API,支持密码保护和分卷压缩等功能,适用于需要额外功能的压缩需求。
  4. LZ4:高压缩速度和解压速度的压缩库,适用于大规模数据压缩和快速数据传输场景,但压缩比较低。
  5. Snappy:极高的压缩速度和较好的解压速度,适用于低延迟的数据传输场景,但压缩比较低。

综合选择压缩工具时,可以根据实际需求权衡性能和功能。如果需要高性能的压缩和解压速度,可以选择LZ4或Snappy;如果需要支持更多的压缩格式和功能,可以选择Apache Commons Compress或Zip4j;如果仅需简单的压缩和解压操作,可以使用java.util.zip。

注意:即便同一种压缩格式,比如zip, 也会有不同的版本,如果采用jdk或zip4j可能并不能成功解压, 如果需要更好的兼容与稳定性, 可以采用Apache Commons Compress进行解压处理。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FFMPEG android mac 编译 支持DASH/OPENSSL问题汇总

一 下载源码 FFMPEG https://github.com/FFmpeg/FFmpeg/tree/release/4.3 二 编写脚本 支持https 就必须添加open SSL 的编译 具体可以查看我的另一个关于open SSL 的 然后我们配置的一些路径 涉及 ndk 的一定要查看你用的ndk 版本 是否存在这些路径这是第一步 然后如果支…

按照Vue写WPF(1):属性绑定

文章目录 前言代码实现效果代码逻辑 总结 前言 作为一个使用Vue非常熟练的C#全干工程师。当我在接触WPF的时候,我就一直想用Vue的想法去重写WPF框架。经过一个星期的琢磨,终于琢磨出来了如何优雅的入参。期间看了上百篇博客,浏览了一堆的视频…

如何把打包的vue项目放到flask中:Flask init参数详解

参数列表 import_name: the name of the application package,感觉没什么用static_url_path: can be used to specify a different path for the static files on the web. Defaults to the name of the static_folder folder。描述静态文件(css&#x…

vue3-Api和数据响应式的变化

问题1&#xff1a;为什么vue3中去掉了vue构造函数&#xff1f; 问题2&#xff1a;谈谈你对vue3数据响应式的理解 去掉了Vue构造函数 在过去&#xff0c;如果遇到一个页面有多个vue应用时&#xff0c;往往会遇到一些问题 <!-- vue2 --> <div id"app1">&…

sketch如何在线打开?有没有什么软件可以辅助

Sketch 在线打开的方法有哪些&#xff1f;这个问题和我之前回答过的「Sketch 可以在线编辑吗&#xff1f;」是一样的答案&#xff0c;没有。很遗憾&#xff0c;Sketch 没有在线打开的方法&#xff0c;Sketch 也做不到可以在线编辑。那么&#xff0c;那些广告里出现的设计软件工…

基于Java+SpringBoot+vue前后端分离网上购物商城系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【高阶数据结构】B树

文章目录 一、B-树1. 常见的搜索结构2. B树概念3. B-树的查找4. B-树的插入分析 二、B树和B*树1. B树2. B*树 三、B-树的应用1. 索引2. MySQL索引简介2.1 MyISAM2.2 InnoDB 一、B-树 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索…

体验文心千帆:开启智能大模型时代的新征程

目录 前言文心千帆的申请和使用感受1.1 注册流程简单1.2 试用初体验 二、文心千帆大模型平台功能介绍2.1 强大的对话式语言模型2.2 丰富的应用场景 三、如何使用 API3.1 API 列表ERNIE-BotERNIE-Bot-turboBLOOMZ-7BEmbedding-V1Prompt模板 3.2 API 调用基本流程3.2.1 创建智能云…

如何在armv6 armv7 armv8(aarch64)嵌入式板子上面安装nginx服务器,支持H265码流

如何在armv6 armv6 armv8 aarch64 嵌入式板子上面安装nginx服务器支持推送H265的视频流 开始吧 一&#xff0c;准备工作二&#xff0c;configure时遇到的出错问题1、checking for C compiler … found but is not working2&#xff0c;error: can not detect int size3&#xf…

【python】使用difflib对比json差异

之前自己使用python写了方法进行对比json数据&#xff0c;这次使用difflib模块实现&#xff1a; 一个json数据存在text1.txt&#xff1a; 另一个json数据存在text2.txt&#xff1a; 1、导入difflib模块 import difflib 2、调用difflib中的HtmlDiff类&#xff0c;使用make_fi…

ShardingSphere分库分表实战之广播表

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

多个springmvc项目共用同一个redis导致session冲突的问题 的解决方案

由于redis来做session的统一管理插件&#xff0c;如果多个项目使用同一个redis来管理session的话&#xff0c;那么session很有可能会出现冲突。 下图&#xff1a;默认session在redis中的key值是spring:session:sessions:sessionId&#xff0c;如果多个项目中出现了相同的sessi…

网络安全(黑客)自学的一些建议

1.选择方向 首先是选择方向的问题&#xff0c;网络安全是一个很宽泛的专业&#xff0c;包含的方向特别多。比如 web安全&#xff0c;系统安全&#xff0c;无线安全 &#xff0c;二进制安全&#xff0c;运维安全&#xff0c;渗透测试&#xff0c;软件安全&#xff0c;IOT安全&a…

docker-compose搭建RocketMq集群

集群架构&#xff1a;双主 机器&#xff1a;172.50.2.41 172.50.2.42 一、创建目录 mkdir -p /docker/alibaba/rocketmq/logs/nameserver mkdir -p /docker/alibaba/rocketmq/logs/broker mkdir -p /docker/alibaba/rocketmq/store/broker mkdir -p /docker/alibaba/rocket…

通过Appium和Accessibility Inspector获取iOS应用元素定位的方法

在 iOS 移动应用程序上使用选择器查找元素定位是我们在移动端 UI 自动化测试的先决条件。 但是&#xff0c;由于应用程序内容在原生 iOS 应用程序中的呈现方式&#xff0c;我们可以用来定位应用程序元素的选择器与 Web 浏览器元素有很大不同。 在本文中&#xff0c;我们将了解 …

Spring Boot 日志文件有什么用

目录 一、自定义打印日志 1.1 日志框架说明 1.2 实现自定义打印日志 1.3 日志的格式说明 2.1 日志的级别 2.2 设置日志级别的作用&#xff1a; 2.3 如何设置日志的级别 二、 日志的持久化 3.1 设置日志保存路径 &#xff08;在 .yml 配置文件中设置日志保存路径&…

一、二维前缀和算法

文章目录 前缀和模板724. 寻找数组的中心下标238. 除自身以外数组的乘积560. 和为 K 的子数组974. 和可被 K 整除的子数组525. 连续数组1314. 矩阵区域和 前缀和模板 一维前缀和&#xff1a; import java.util.*;public class Main {public static void main(String[] args) …

docker-compose启动minio

一、创建文件夹 mkdir -p /docker/stand-alone-minio/data mkdir -p /docker/stand-alone-minio/configchmod 777 -R /docker/stand-alone-minio/data chmod 777 -R /docker/stand-alone-minio/config 二、docker-compose.yml version: 3.9services:minio:image: minio/mini…

【Vue3基础】计算属性

一、需求 二、代码 1、创建项目 创建项目&#xff1a; 1、 npm init vuelatest 2、一路回车 3、输入项目名&#xff0c;不要大写&#xff0c;如vue3bilibili 4、 cd vue3bilibili 5、 npm install 6、npm run dev启动&#xff0c;可以获取网址 2、App.vue文件中&#xff1a;…