精华内容
下载资源
问答
  • 目录一、文件压缩二、文件分割三、文件合并四、文件解压...-c:建立一个压缩文件指令; -v:压缩过程中是否显示文件; -f :使用档名; 二、文件分割 split -b 40M -d -a 2 test.tar.gz test.tar.gz. 参数含义: -...

    一、文件压缩

    tar -zcvf test.tar.gz test/
    

    参数含义:
    -z:是否同时具有gzip属性,是否需要gzip压缩;
    -c:建立一个压缩文件指令;
    -v:压缩过程中是否显示文件;
    -f :使用档名;
    在这里插入图片描述

    二、文件分割

    split -b 40M -d -a 2 test.tar.gz test.tar.gz.
    

    参数含义:
    -b:指定每个文件的大小,单位可以为B、K、M ;
    -d:使用数字而不是字母作为后缀名 ;
    -a:后缀名长度,默认为2;
    在这里插入图片描述

    三、文件合并

    cat test.tar.gz.* > test_new.tar.gz
    

    在这里插入图片描述

    四、文件解压

    tar -zxvf test_new.tar.gz -C ./Directory/
    

    参数说明:
    -z:是否同时具有gzip属性,是否需要gzip压缩;
    -x:解压缩指令;
    -v:压缩过程中是否显示文件;
    -f :使用档名;
    在这里插入图片描述

    展开全文
  • 用360压缩文件分卷压缩

    千次阅读 2017-05-04 10:59:23
    用360压缩文件进行分卷压缩

    最近下载了很多东西。

    几十万个小文件。一个文件几十KB。

    想放到移动硬盘和网盘里备个份。这么多小文件移动、复制起来都很慢……

    只好压缩一下。


    百度云管家对上传的文件有4GB大小限制,只好分卷压缩。用360压缩。


    1. 对准要压缩的文件点右键

    2. 添加到压缩文件

    3. 选自定义

    4. 选分卷大小



    展开全文
  • Redis-x64-4.0.14.2.msi 、Redis-x64-4.0.zip 存在压缩文件里面 右键解压Redis压缩包,把所有文件解压到指定的redis文件夹中 1.配置redis.windows.conf文件,除了port配置为对应的端口外,其他根据需要可更改的配置...
  • 最近整理资料,发现很多 pdf 文档,占用了不少的存储空间,考虑使用 7-zip 进行压缩存储,由于文件比较多,且分散在不同目录下,一个个文件压缩比较繁琐。为了提高效率且,方便后面取用,所有打算捣鼓个批处理文件,...


    最近整理资料,发现很多 pdf 文档,占用了不少的存储空间,考虑使用 7-zip 进行压缩存储,由于文件比较多,且分散在不同目录下,一个个文件压缩比较繁琐。为了提高效率且,方便后面取用,所有打算捣鼓个批处理文件,来实现命令行调用 7-zip 来对目录下的每个文档进行单独打包,并将打包后的压缩包存到指定的目录下,详细内容见下文。

    本文在 Windows10 64位 操作系统下,使用的命令行提示符(cmd)版本为 10.0.17134.7067-zip64位 16.04 版本,使用下面脚本时请确保安装了 7-zip ,可在此处下载最新版


    for 命令实现

    以下展示几种通过 for 命令来遍历打包压缩批处理文件的示例:

    @echo off
    :: 切换当前编码方式为 UTF-8,处理命令行窗口标题乱码问题
    chcp 65001
    title 批量压缩当前目录下个文件到各自压缩包
    :: 切换回默认 GBK 编码,处理命令行输出乱码问题
    chcp 936
    echo ---------- START -------------
    
    :: 实现一:遍历当前目录下(不含子目录)的pdf文件, 压缩成与当前文件同名的 7z 格式文件, 最后压缩文件存放在当前目录下新建的 7z 文件夹(可自定义,特换自己想要的文件夹名称)下
    :: for %%F in (*.pdf) do (echo "%%~nF" && "C:\Program Files\7-Zip\7z.exe" a -t7z ".\7z\%%~nF.7z" "%%F" )
    
    :: 实现二:遍历当前目录下(不含子目录)的文件夹进行压缩, 压缩成与当前文件夹同名的 7z 格式文件 , 最后压缩文件存放在目录下新建的 7z 文件夹(可自定义,特换自己想要的文件夹名称)下(如想以目录形式打包,可以参考此方式)
    :: for /d %%F in (*) do (echo "%%~nF" && "C:\Program Files\7-Zip\7z.exe" a -t7z ".\7z\%%~nF.7z" "%%F" )
    
    :: 实现三:遍历当前目录下(含子目录)的pdf文件进行压缩, 压缩成与当前文件同名的 7z 格式文件 , 最后压缩文件存放在目录下新建的 7z 文件夹(可自定义,特换自己想要的文件夹名称)下
    :: for /r %%F in (*.pdf) do (echo "%%~nF" && "C:\Program Files\7-Zip\7z.exe" a -t7z ".\7z\%%~nF.7z" "%%F" )
    
    :: 实现四:遍历当前目录下(含子目录)的pdf文件进行压缩, 压缩成与当前文件同名的 7z 格式文件 , 最后压缩文件存放在与当前文件同目录下
    :: for /r %%F in (*.pdf) do (echo "%%~nF" && "C:\Program Files\7-Zip\7z.exe" a -t7z "%%~dpnF.7z" "%%F" )
    
    :: 实现五:遍历当前目录下(含子目录)的pdf文件进行压缩, 打包到 PDF.7z 压缩包内 , 最后压缩文件存放在当前目录下
    ::for /r %%F in (*.pdf) do (echo "%%~nF" && 7z a -t7z "PDF.7z" "%%F" )
    
    echo ----------  END  -------------
    pause
    

    以上展示了几种处理方式,更多方式自行扩展,如:

    • 上述示例均已 .pdf 类型为例,如果想压缩其他类型文件,可以更换 *.pdf 为对应的 *.类型 (如, *.doc ),其他通配符自行尝试;
    • 如想将文件压缩为 zip 格式,则替换命令中的 -t7z ".\7z\%%~nF.7z" 替换成 -tzip ".\7z\%%~nF.zip"
    • 如想改变压缩算法或比例等,参考下文 7z 的相关命令,进行尝试;

    使用方法

    1. 复制以上代码内容到新建的文本文档内;(可以在此处下载脚本文件
    2. 确定要使用哪种实现来批量打包自己的文件,则删除对应实现下 for 命令前的双英文冒号(::,此符号等效于 rem 命令,是批处理文件的注释标识符,双英文冒号后面的内容是注释说明,不会被当做代码执行 ),并保存;
    3. 修改该新建文本文档的扩展名 .txt 改为 .bat,文件名自行定义;
    4. 将文件拷到要使用的目录下,双击运行(切记不要管理员模式运行)。

    使用上述代码需要特别注意:

    • 当前 for 命令实现版本,不要使用管理员方式运行!不要使用管理员方式运行!不要使用管理员方式运行!重要的事情说三遍!管理员方式运行,会在 System32 目录下生效(因管理员模式运行时,会调用 System32 目录下的 cmd 命令提示符来执行脚本) ,切记!
    • 代码中的 C:\Program Files\7-Zip\7z.exe 是本人电脑上安装的路径,注意安装了 7-zip ,并修改为自己电脑上的路径,否则无法使用,如果将 7z 安装路径配置到环境变量 path 中,则可以将此处的路径替换为 7z.exe(或 7z

    批处理 for 命令说明

    for 命令可以对一组文件中的每个文件进行指定的操作,命令语法如下:

    FOR %variable IN (set) DO command [command-parameters]
    

    cmd 命令行下使用命令 for /? 可以看到 for 相关的解释说明:

    对一组文件中的每一个文件执行某个特定命令。
    
    FOR %variable IN (set) DO command [command-parameters]
    
      %variable  指定一个单一字母可替换的参数。
      (set)      指定一个或一组文件。可以使用通配符。
      command    指定对每个文件执行的命令。
      command-parameters
                 为特定命令指定参数或命令行开关。
    
    在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
    
    如果启用命令扩展,则会支持下列 FOR 命令的其他格式:
    	FOR /D %variable IN (set) DO command [command-parameters]
    
    如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
    	FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
    
            检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
            如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
            则枚举该目录树。
    
    	FOR /L %variable IN (start,step,end) DO command [command-parameters]
    
        	该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列 1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)
    
        FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
        FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
        FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
    
            或者,如果有 usebackq 选项:
    
        FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
        FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
        FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
    
            fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前,
            每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,
            然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。
            以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
            你可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个
            或多个指定不同解析选项的关键字。这些关键字为:
    
                eol=c           - 指一个行注释字符的结尾(就一个)
                skip=n          - 指在文件开始时忽略的行数。
                delims=xxx      - 指分隔符集。这个替换了空格和制表符的
                                  默认分隔符集。
                tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                                  的 for 本身。这会导致额外变量名称的分配。m-n
                                  格式为一个范围。通过 nth 符号指定 mth。如果
                                  符号字符串中的最后一个字符星号,
                                  那么额外的变量将在最后一个符号解析之后
                                  分配并接受行的保留文本。
                usebackq        - 指定新语法已在下类情况中使用:
                                  在作为命令执行一个后引号的字符串并且一个单
                                  引号字符为文字字符串命令并允许在 file-set
                                  中使用双引号扩起文件名称。
    
    某些范例可能有助:
    
    	FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
    
            会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
            每行中的第二个和第三个符号传递给 for 函数体,用逗号和/或
            空格分隔符号。请注意,此 for 函数体的语句引用 %i 来
            获得第二个符号,引用 %j 来获得第三个符号,引用 %k
            来获得第三个符号后的所有剩余符号。对于带有空格的文件
            名,你需要用双引号将文件名括起来。为了用这种方式来使
            用双引号,还需要使用 usebackq 选项,否则,双引号会
            被理解成是用作定义某个要分析的字符串的。
    
            %i 在 for 语句中显式声明,%j 和 %k 是通过
            tokens= 选项隐式声明的。可以通过 tokens= 一行
            指定最多 26 个符号,只要不试图声明一个高于字母 "z" 或
            "Z" 的变量。请记住,FOR 变量是单一字母、分大小写和全局的变量;
            而且,不能同时使用超过 52 个。
    
            还可以在相邻字符串上使用 FOR /F 分析逻辑,方法是,
                用单引号将括号之间的 file-set 括起来。这样,该字符
            串会被当作一个文件中的一个单一输入行进行解析。
    
    最后,可以用 FOR /F 命令来分析命令的输出。方法是,将
    括号之间的 file-set 变成一个反括字符串。该字符串会
    被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到
    内存中,并被当作文件分析。如以下例子所示:
          FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
    
        	会枚举当前环境中的环境变量名称。
    
    
    另外,FOR 变量参照的替换已被增强。你现在可以使用下列
    选项语法:
         %~I          - 删除任何引号("),扩展 %I
         %~fI        - 将 %I 扩展到一个完全合格的路径名
         %~dI        - 仅将 %I 扩展到一个驱动器号
         %~pI        - 仅将 %I 扩展到一个路径
         %~nI        - 仅将 %I 扩展到一个文件名
         %~xI        - 仅将 %I 扩展到一个文件扩展名
         %~sI        - 扩展的路径只含有短名
         %~aI        - 将 %I 扩展到文件的文件属性
         %~tI        - 将 %I 扩展到文件的日期/时间
         %~zI        - 将 %I 扩展到文件的大小
         %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
                       到找到的第一个完全合格的名称。如果环境变量名
                       未被定义,或者没有找到文件,此组合键会扩展到
                       空字符串
    
    可以组合修饰符来得到多重结果:
    
         %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
         %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
         %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
         %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
                       到找到的第一个驱动器号和路径。
         %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR
    
    在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
    用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。
    
    

    微软文档说明中语法如下

    for {%%|%}<Variable> in (<Set>) do <Command> [<CommandLineOptions>]
    
    参数描述
    {%%|%}必需。 表示可替换参数。在命令提示符执行 for 命令时使用一个百分号 ( % ), 在命令批处理文件中执行 for 命令时使用双百分号 ( %% ) 。变量区分大小写,且必须使用字母表示,如 %A%B,或 %C
    ()必需。 指定一个或多个文件,目录或文本字符串,或运行该命令的一系列值。 两边需要圆括号。
    必需。 指定要在每个文件、 目录或文本字符串或上中包含的值的范围缩小执行的命令设置
    指定你想要指定命令中使用任何命令行选项。
    /?在命令提示符下显示帮助。

    更多介绍及示例参看此处


    forfiles 命令实现

    以下展示几种通过 forfiles 命令来遍历打包压缩批处理文件的示例:

    @echo off
    :: 切换当前编码方式为 UTF-8,处理命令行窗口标题乱码问题
    chcp 65001
    title 批量压缩当前目录下个文件到各自压缩包
    :: 切换回默认 GBK 编码,处理命令行输出乱码问题
    chcp 936
    echo ---------- START -------------
    
    ::实现一:遍历当前目录下(含子目录)的pdf文件进行压缩, 压缩成与当前文件同名的 7z 格式文件 , 最后压缩文件存放在 7z 目录下
    :: Forfiles /P .\ /s /m *.pdf /c "cmd /c echo @FNAME && 7z a -t7z .\7z\@FNAME.7z @PATH"
    
    ::实现二:遍历当前目录下(含子目录)的pdf文件进行压缩, 压缩成与当前文件同名的 7z 格式文件 , 最后压缩文件存放在与当前文件同目录下
    :: Forfiles /P .\ /s /m *.pdf /c "cmd /c echo @FNAME && 7z a -t7z ./@FNAME.7z @PATH"
    
    ::实现三:遍历当前目录下(不含子目录)的pdf文件进行压缩, 压缩成与当前文件同名的 7z 格式文件 , 最后压缩文件存放在 7z 目录下
    ::Forfiles /P .\ /m *.pdf /c "cmd /c echo @FNAME && 7z a -t7z .\7z\@FNAME.7z @RELPATH"
    
    ::实现四:遍历当前目录下(含子目录)的pdf文件进行压缩, 打包到 PDF.7z 压缩包内 , 最后压缩文件存放在当前目录下
    :: Forfiles /P .\ /s /m *.pdf /c "cmd /c echo @FNAME && 7z a -t7z .\PDF.7z @PATH"
    
    echo ----------  END  -------------
    pause
    

    以上展示了几种 forflies 命令的处理方法,更多扩展使用,自行尝试,使用方法类似之前 for 命令实现的使用方法。可以在此处下载脚本文件

    使用上述代码需要特别注意:

    • forfiles 命令,需要自己给定要处理的目录路径(如,代码中的 D:\work 是我存放 pdf 等文件的目录,替换成自己的目录即可)

    • 给定目录后,可以在任意位置执行该脚本,且可以管理员方式运行。

    • 7-zip 安装路径配置到环境变量 path 中,以方便在 forfilescmd 命令字符串中使用


    批处理 forfiles 命令说明

    forfiles 命令可以对一组文件中的每个文件进行指定的操作,命令语法如下:

    FORFILES [/P pathname] [/M searchmask] [/S] 
    		 [/C command] [/D [+ | -] {yyyy/MM/dd | dd}]
    

    cmd 命令行下使用命令 forfiles /? 可以看到 forfiles 相关的解释说明:

    FORFILES [/P pathname] [/M searchmask] [/S]
             [/C command] [/D [+ | -] {yyyy/MM/dd | dd}]
    
    描述:
        选择一个文件(或一组文件)并在那个文件上
        执行一个命令。这有助于批处理作业。
    
    参数列表:
        /P    pathname      表示开始搜索的路径。默认文件夹是当前工作的
                            目录 (.)。
        /M    searchmask    根据搜索掩码搜索文件。默认搜索掩码是 '*'。
        /S                  指导 forfiles 递归到子目录。像 "DIR /S"。
        /C    command       表示为每个文件执行的命令。命令字符串应该
                            用双引号括起来。
                            
                            默认命令是 "cmd /c echo @file"。下列变量
                            可以用在命令字符串中:
                            
                            @file    - 返回文件名。
                            @fname   - 返回不带扩展名的文件名。
                            @ext     - 只返回文件的扩展名。
                            @path    - 返回文件的完整路径。
                            @relpath - 返回文件的相对路径。
                            @isdir   - 如果文件类型是目录,返回 "TRUE";
                                       如果是文件,返回 "FALSE"。
                            @fsize   - 以字节为单位返回文件大小。
                            @fdate   - 返回文件上一次修改的日期。
                            @ftime   - 返回文件上一次修改的时间。
    
                            要在命令行包括特殊字符,字符请以 0xHH
                            形式使用十六进制代码(例如,0x09 为 tab)。
                            内部 CMD.exe 命令前面应以 "cmd /c" 开始。
    
        /D    date          选择文件,其上一次修改日期大于或等于 (+),
                            或者小于或等于 (-) 用 "yyyy/MM/dd" 格式指定的日期;
    
                            或选择文件,其上一次修改日期大于或等于 (+)
                            当前日期加 "dd" 天,或者小于或等于 (-) 当前
    
                            日期减 "dd" 天。有效的 "dd" 天数可以是
                            0 - 32768 范围内的任何数字。如果没有指定,
    
                            "+" 被当作默认符号。
    
        /?                  显示此帮助消息。
    
    示例:
        FORFILES /?
        FORFILES
        FORFILES /P C:\WINDOWS /S /M DNS*.*
        FORFILES /S /M *.txt /C "cmd /c type @file | more"
        FORFILES /P C:\ /S /M *.bat
        FORFILES /D -30 /M *.exe
                 /C "cmd /c echo @path 0x09 在 30 前就被更改。"
        FORFILES /D 2001/01/01
                 /C "cmd /c echo @fname 在 2001年1月1日就是新的。"
        FORFILES /D +2019/6/14 /C "cmd /c echo @fname 今天是新的。"
        FORFILES /M *.exe /D +1
        FORFILES /S /M *.doc /C "cmd /c echo @fsize"
        FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
    
    

    微软文档说明中语法如下

    forfiles [/p <Path>] [/m <SearchMask>] [/s] [/c "<Command>"] [/d [{+|-}][{<Date>|<Days>}]]
    
    参数描述
    /p 指定开始搜索的路径。默认情况下,搜索从当前工作目录开始。
    /m 根据指定的搜索掩码搜索文件。默认搜索掩码是 *.\ *
    /s指示forfiles命令以递归方式搜索子目录。
    在每个文件上运行指定的命令。命令字符串包含在双引号中。默认命令是“cmd / c echo @file”。
    /d [{+|-}]⁠[{|}]选择具有指定的时间范围内的上次修改日期的文件。
    - 选择文件的上次修改日期晚于或等于 ( + ) 或早于或等于 ( - ) 指定的日期,其中日期采用格式 MM/DD/YYYY。
    - 选择文件的上次修改日期晚于或等于 ( + ) 的当前日期加上指定,天内或早于或等于 ( - ) 的当前日期减去天数指定。
    有效值范围 0-32,768 中包含任意数量。 如果指定没有登录,则 + 默认情况下使用。
    /?在命令提示符下显示帮助。

    更多介绍及示例参看此处


    关于 7-zip

    7-Zip 是一款拥有极高压缩比的开源压缩软件。支持 Windows、Linux等平台。通常使用 7-Zip.7z 格式能比使用 .zip 格式的压缩档案小 30-70%。并且使用 7-Zip 创建的 .zip 格式比大多数其它压缩软件创建的都小 2-10%。关于 7-zip 等更多内容,可以参看官网说明

    7-zip 安装完成后,在安装目录下,可以找到当前版本 7-zip.chm 帮助文档,中文帮助文档可以在此处下载 ,文档下载后,打开无内容,可以尝试在文档属性中勾选 解除锁定 ,点击应用即可。

    7-zip文档解除锁定

    7-zip 命令行的语法格式大致如下:

    7z <command> [<switch>...] <base_archive_name> [<arguments>...]
    
    7z <命令行> [<选项>...] <基本档案名称> [<参数变量>...]
    

    关于 7-zip 命令行版本的更多内容,在文档中有较为详细的介绍,并附有示例,可以自行学习尝试。

    7-zip 命令行版本用户手册


    DEL 命令删除文件

    最后,附上递归删除指定类型文件批处理代码(可以用来批量删除打包的源文件)

    **特别注意:**此删除为完全删除,回收站不可见,且无法撤销还原,请慎用!!!

    :: 删除目录下(含子目录下)符合条件的文件
    @echo off
    :: 不推荐使用此方法,管理员模式运行时可能会误删 System32 目录下文件,请慎用!!!
    ::for /r %%F in (*.7z) do (DEL /p "%%F" )
    
    :: 推荐使用此方法,支持管理员方式运行(因提供了绝对路径)
    forfiles /P "D:\work" /s /m *.7z /c "cmd /c DEL /p @PATH"
    pause
    

    cmd 命令行下使用命令 DEL /? 可以看到 DEL 相关的解释说明:

    删除一个或数个文件。
    
    DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
    ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
    
      names         指定一个或多个文件或者目录列表。
                    通配符可用来删除多个文件。
                    如果指定了一个目录,该目录中的所
                    有文件都会被删除。
    
      /P            删除每一个文件之前提示确认。
      /F            强制删除只读文件。
      /S            删除所有子目录中的指定的文件。
      /Q            安静模式。删除全局通配符时,不要求确认
      /A            根据属性选择要删除的文件
      属性          R  只读文件                     S  系统文件
                    H  隐藏文件                     A  存档文件
                    I  无内容索引文件               L  重分析点
                    -  表示“否”的前缀
    
    如果命令扩展被启用,DEL 和 ERASE 更改如下:
    
    /S 开关的显示句法会颠倒,即只显示已经
    删除的文件,而不显示找不到的文件。
    

    建议: 使用删除时,DEL 命令后使用 /p 命令参数,来手动确认删除文件,防止误删!


    参考阅读

    微软文档 - Windows Commands

    Computer Hope - Microsoft DOS and Windows command line

    7-zip 中文帮助文档

    展开全文
  • 使用Java实现多个文件压缩打包

    千次阅读 2017-10-17 22:46:45
    引言  在做项目的时候经常会涉及到文件压缩,比如近期用Java Web做一个后台管理,后台有个导出功能,需要统计生成几十个excel文件,然后进行下载,如果不将这些文件进行压缩传送,耗费用户流量不说,用户浏览器...

    ###引言
      在做项目的时候经常会涉及到文件的压缩,比如近期用Java Web做一个后台管理,后台有个导出功能,需要统计生成几十个excel文件,然后进行下载,如果不将这些文件进行压缩传送,耗费用户流量不说,用户浏览器还会一个接一个地接收文件不停的点击确认保存。所以需要对文件进行压缩传送。
      关于文件压缩,Java的java.util.zip包提供了这个功能。这个包下总共有20多个相关的类,下面介绍一下常用的几个类,读者感兴趣也可查看该工具包。
      该工具包下和解压缩相关的基类有ZipInputStream、ZipOutputStream、GZIPInputStream、GZIPOutputStream。其中ZipInputStream、GZIPInputStream这两个输入流主要用于解压时读取压缩文件,ZipOutputStream、GZIPOutputStream两个输出流用于压缩,将数据流写入压缩文件。通过名字我们可以看到这两个类对应我们常见的以.zip和.gzip结尾的压缩文件类型。另外还有一个ZipFile,这个类会在解压时用到。个人理解是用于初始化解析File。
      关于压缩,首先贴上实现的压缩代码

    /**
     * Created by someone on 2017/10/16.
     */
    public class IOUtil {
    
        /**
         * 通过指定路径和文件名来获取文件对象,当文件不存在时自动创建
         * @param path
         * @param fileName
         * @return
         * @throws IOException
         */
        public static File getFile(String path, String fileName) throws IOException {
            // 创建文件对象
            File file;
            if (path != null && !path.equals(""))
                file = new File(path, fileName);
            else
                file = new File(fileName);
            if (!file.exists()) {
                file.createNewFile();
            }
            // 返回文件
            return file;
        }
    
        /**
         * 获得指定文件的输出流
         * @param file
         * @return
         * @throws FileNotFoundException
         */
        public static FileOutputStream getFileStream(File file) throws FileNotFoundException {
            return new FileOutputStream(file);
        }
    
        /**
         * 将多个文件压缩
         * @param fileList 待压缩的文件列表
         * @param zipFileName 压缩文件名
         * @return 返回压缩好的文件
         * @throws IOException
         */
        public static File getZipFile(List<File> fileList, String zipFileName) throws IOException {
            File zipFile = getFile(PathConfig.getPath(), zipFileName);
            // 文件输出流
            FileOutputStream outputStream = getFileStream(zipFile);
            // 压缩流
            ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
    
            int size = fileList.size();
            // 压缩列表中的文件
            for (int i = 0;i < size;i++) {
                File file = fileList.get(i);
                zipFile(file, zipOutputStream);
            }
            // 关闭压缩流、文件流
            zipOutputStream.close();
            outputStream.close();
            return zipFile;
        }
    
        /**
         * 将文件数据写入文件压缩流
         * @param file 带压缩文件
         * @param zipOutputStream 压缩文件流
         * @throws IOException
         */
        private static void zipFile(File file, ZipOutputStream zipOutputStream) throws IOException {
            if (file.exists()) {
                if (file.isFile()) {
                    FileInputStream fis = new FileInputStream(file);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    ZipEntry entry = new ZipEntry(file.getName());
                    zipOutputStream.putNextEntry(entry);
    
                    final int MAX_BYTE = 10 * 1024 * 1024; // 最大流为10MB
                    long streamTotal = 0; // 接收流的容量
                    int streamNum = 0; // 需要分开的流数目
                    int leaveByte = 0; // 文件剩下的字符数
                    byte[] buffer; // byte数据接受文件的数据
    
                    streamTotal = bis.available(); // 获取流的最大字符数
                    streamNum = (int) Math.floor(streamTotal / MAX_BYTE);
                    leaveByte = (int) (streamTotal % MAX_BYTE);
    
                    if (streamNum > 0) {
                        for (int i = 0;i < streamNum;i++) {
                            buffer = new byte[MAX_BYTE];
                            bis.read(buffer, 0, MAX_BYTE);
                            zipOutputStream.write(buffer, 0, MAX_BYTE);
                        }
                    }
    
                    // 写入剩下的流数据
                    buffer = new byte[leaveByte];
                    bis.read(buffer, 0, leaveByte); // 读入流
                    zipOutputStream.write(buffer, 0, leaveByte); // 写入流
                    zipOutputStream.closeEntry(); // 关闭当前的zip entry
    
                    // 关闭输入流
                    bis.close();
                    fis.close();
                }
            }
        }
    }
    

      代码比较好懂,就是循环遍历待压缩文件列表,将每个文件写入到压缩流。

      主要看下private static void zipFile(File file, ZipOutputStream zipOutputStream) throws IOException这个压缩的核心代码方法签名。可以看到在该方法中我们首先实例化了一个ZipEntry 对象,之后就是将zipEntry对象作为参数并调用了ZipOutputStream的putNextEntry()方法,接下来读取File的数据流并写入压缩流,通过循环将数据流写入压缩流完毕后,就调用了zipOutputStream的closeEntry()方法关闭当前的ZipEntry。

      用Java实现文件压缩功能到此就实现完毕了,很简单。但是这里我比较好奇究竟是怎么进行压缩的,于是就寻着ZipOutputStream的方法调用去查个究竟。下面是ZipOutputStream的代码实现,putNextEntry方法和write方法:

    /**
         * 开始一个新的Zip入口。如果当前入口是打开状态则关闭。把新入口作为当前的压缩流入口
         * 如果没有指定压缩方法,则会使用默认的压缩方法。
         * 如果没有指定文件修改时间,则会使用系统当前时间。
         * @param e 将要写入压缩流的入口
         * @exception ZipException 如果发生了压缩错误抛出此异常
         * @exception IOException 如果发生了IO错误抛出此异常
         */
        public void putNextEntry(ZipEntry e) throws IOException {
            ensureOpen(); // 确保压缩流为打开状态
            if (current != null) {
                closeEntry();       // 关闭之前的入口
            }
            if (e.xdostime == -1) {
                // 如果没有文件修改时间,则使用当前系统时间
                e.setTime(System.currentTimeMillis());
            }
            if (e.method == -1) {
                e.method = method;  // 使用默认压缩方法,有DEFAULT和STORED两种
            }
            // 存储大小, 压缩后大小, crc-32 in LOC header
            e.flag = 0;
            switch (e.method) {
            case DEFLATED:
                // store size, compressed size, and crc-32 in data descriptor
                // immediately following the compressed entry data
                if (e.size  == -1 || e.csize == -1 || e.crc   == -1)
                    e.flag = 8;
    
                break;
            case STORED:
    	    // 使用STORED压缩方法,压缩后大小、压缩前大小和crc-32一定被设置过。
                if (e.size == -1) {
                    e.size = e.csize;
                } else if (e.csize == -1) {
                    e.csize = e.size;
                } else if (e.size != e.csize) {
                    throw new ZipException(
                        "STORED entry where compressed != uncompressed size");
                }
                if (e.size == -1 || e.crc == -1) {
                    throw new ZipException(
                        "STORED entry missing size, compressed size, or crc-32");
                }
                break;
            default:
                throw new ZipException("unsupported compression method");
            }
            if (! names.add(e.name)) {
                throw new ZipException("duplicate entry: " + e.name);
            }
            if (zc.isUTF8())
                e.flag |= EFS;
            current = new XEntry(e, written); // 使用XEntry将ZipEntry包裹
            xentries.add(current); // 将该入口添加到Vector<XEntry>
            writeLOC(current); // 添加头部信息
        }
        
        /**
         * 将byte数组写到入口,即将从数据流读到的数据写入压缩流
         * @param b byte数组
         * @param off byte数组的偏移
         * @param len 要写入的大小
         * @exception ZipException if a ZIP file error has occurred
         * @exception IOException if an I/O error has occurred
         */
        public synchronized void write(byte[] b, int off, int len)
            throws IOException
        {
            ensureOpen();
            if (off < 0 || len < 0 || off > b.length - len) {
                throw new IndexOutOfBoundsException();
            } else if (len == 0) {
                return;
            }
    
            if (current == null) {
                throw new ZipException("no current ZIP entry");
            }
            ZipEntry entry = current.entry;
            switch (entry.method) {
            case DEFLATED: // 默认是DEFLATED,所以会首先调用父类的write方法。
                super.write(b, off, len);
                break;
            case STORED:// 如果数据本来是压缩的,那么就将拿到的数据流直接写到压缩流了
                written += len;
                if (written - locoff > entry.size) {
                    throw new ZipException(
                        "attempt to write past end of STORED entry");
                }
                out.write(b, off, len);
                break;
            default:
                throw new ZipException("invalid compression method");
            }
            crc.update(b, off, len);
        }
    

      从上边的write方法中我们看到其实是调用了父类DeflaterOutputStream的write方法:

        public void write(byte[] b, int off, int len) throws IOException {
            if (def.finished()) {
                throw new IOException("write beyond end of stream");
            }
            if ((off | len | (off + len) | (b.length - (off + len))) < 0) {
                throw new IndexOutOfBoundsException();
            } else if (len == 0) {
                return;
            }
            if (!def.finished()) { // 判断已经压缩的数据输出流是否结束
                def.setInput(b, off, len); // 设置压缩需要的输入数据,调用该方法其实并没有 做什么事情,只是简单的进行赋值
                while (!def.needsInput()) { // 循环判断是否需要输入数据,根据len的值是否小于等于0.
                    deflate(); // 这个才是压缩的核心方法
                }
            }
        }
    

    通过以上代码,我们看到deflate()方法才是压缩的核心代码,该方法最终会通过JNI本地调用deflateBytes方法来进行压缩,该方法或将压缩后的字节大小返回,因为数据流byte是引用类型,所以通过该压缩方法处理后会变成压缩后的数据,有了压缩后的数据以及大小,接下来就可以通过out.write(buf, 0, len);将压缩后的数据写入压缩流了。所以关于数据压缩的核心代码在Java中是看不到了~

    展开全文
  • ubuntu下分割大压缩文件

    千次阅读 2018-12-14 23:27:14
    1.要分割的文件夹名:test 2.终端输入: tar -zcvf - test | split -b 15G -d -a 1 - test.tar.gz ...“15g”代表分割后每个压缩文件的大小 3.合并上面分割的压缩包 cat test.tar.gz* &gt; test.tar.gz ...
  • WinRAR压缩文件参数详解

    千次阅读 2017-02-10 18:14:14
    将D:/wk.doc 压缩为:final.rar  d:/winrar/rar a d:/final.rar d:/wk.doc  将final.rar中的wk.doc解压到F:盘  rar e d:/final.rar F:  将final.rar转换成自解压文件  rar s final,rar(默认转换到...
  • 6.超时,这个是处理单个压缩文件时的超时设置,请以自己要处理的最大的文件的时间为准。 7.处理子压缩包,如果压缩包中还有压缩包要处理,选中此项 8.保留原注释。像winrar如果有注释,默认都是给去掉的,选中则保留...
  • gzip命令:压缩文件或目录

    千次阅读 2020-08-14 22:19:23
    再强调一下,gzip 命令只能用来压缩文件,不能压缩目录,即便指定了目录,也只能压缩目录内的所有文件。 gzip 命令的基本格式如下: [root@localhost ~]# gzip [选项] 源文件 命令中的源文件,当进行压缩操作时,...
  • linux gzip压缩/解压缩*.gz文件

    万次阅读 2019-01-29 14:48:09
    gzip命令是常用的压缩和解压缩命令。 语法帮助使用gzip --help可以查看使用手册: -c, --stdout write on standard output, keep original files unchanged -d, --decompress decompress -f, --force force ...
  • 将一个文件以各个字符出现的次数为权值建立哈夫曼树,这样每个字符可以用从树根到该字符所在到叶子节点的路径来表示。(左为0,右为1) 压缩第二步: 哈夫曼编码有一个很重要的特性:每个字符编码不会成为另一个编码...
  • 为什么大文件需要分块压缩?首先,因为网络传输是存在time-out参数的,部分网站不支持断点续传,当文件上传时间过长时,与网站的连接会断开,导致文件上传失败。其次,大部分网盘会有单文件上传大小限制,通过分块...
  • python实现文件压缩与解压缩

    万次阅读 2018-05-29 13:54:00
    shutil对压缩包的处理是...对于zip文件来说 import zipfile # zipfile压缩 z = zipfile.ZipFile('ss.zip', 'w', zipfile.ZIP_STORED) #打包,zipfile.ZIP_STORED是默认参数 # z = zipfile.ZipFile('ss.zip', 'w...
  • Original url:https://blog.csdn.net/xunan003/article/details/79068648有没有遇到某些...有个方法可以解决此类问题,将压缩包分成多个文件,问题就迎刃而解,这就叫:分卷压缩。如何进行分卷压缩与解压呢,有如...
  • Linux之压缩压缩

    万次阅读 2019-04-15 14:41:18
    (1)Linux上常见压缩文件扩展名: *.Z: compress程序压缩文件,目前使用较少。已经有gzip替换了。 *.gz: gzip程序压缩的文件。 *.bz2:bzip2程序压缩的文件,比gzip的压缩比更好。 无论gzip还是bzip2压缩,都只能对...
  • linux下五种常见的格式的文件压缩

    千次阅读 2017-10-10 21:43:04
    .zip压缩命令(压缩文件和目录没有任何毛病): 常用压缩格式:.zip .gz .bz2 .tar.gz .tar.bz2 格式:zip 压缩文件名(可以不写压缩名,但是严格意义上区分压缩文件名) 源文件名 zip -r 压缩文件名 源文件名 压缩...
  • SpringMVC下压缩文件下载

    千次阅读 热门讨论 2017-02-26 21:28:03
    最近在做文件下载的功能,由于下载的是图片,内容... 1)在服务器端建立一个临时压缩文件  2)找到文件路径,用JDK自带的API进行文件压缩  3)将zip文件下载,文件流输出  4)删除服务器端临时文件  文件下载:
  • 我们经常会在 Windows 系统上使用 “.zip”格式压缩文件,其实“.zip”格式文件是 Windows 和 Linux 系统都通用的压缩文件类型,属于几种主流的压缩格式(zip、rar等)之一,是一种相当简单的分别压缩每个文件的存储...
  • 如这种按年月日的文件夹要分开压缩需要使用通配符匹配压缩,如只压缩2017年的: find 2017* | xargs tar -zcvf 2017.tar.gz 或者: tar cvf 2017.tar 2017* 或者: tar cvfz 2017.tar.gz 2017* 二,linux压缩...
  • Linux下常见压缩文件 压缩和解压

    千次阅读 2017-12-07 14:21:54
    压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cvf [目标文件名].tar [原文件名/目录名] 解包:tar -xvf [原...
  • 一、文件合并:将多个文件中的内容合并到一个文件中 1、&gt; 符号的作用: 将左边的输出内容覆盖到右边的文件中 cat /etc/passwd &gt; 9.txt:将passwd文件中看到的内容覆盖到9.txt文件中   echo '...
  • Linux压缩多个文件或者文件夹的命令

    千次阅读 2017-05-16 17:51:42
    tar -czvf a.tar.gz(想压缩文件名) 源文件名1 源文件名2 源文件夹1 源文件夹2
  • Linux gzip压缩/解压 *.gz文件详解

    万次阅读 2019-02-12 17:12:52
    gzip 是linux中常见的压缩/解压工具,最常见的使用对象是*.gz格式的文件,这里简单介绍下它最常见的用法, GZIP(1) General Commands Manual GZIP(1) NAME  gzip, gunzip, zcat - compress or expand files ...
  • unzip testall.zip`# 1.先合并文件 cat test.z* &gt; testall.zip # 2....有个方法可以解决此类问题,将压缩包分成多个文件,问题就迎刃而解,这就叫:分卷压缩。 如何进行分卷压缩与解压呢,有如下...
  • 压缩文件密码暴力破解——cRARk使用方法

    万次阅读 多人点赞 2021-02-24 15:44:17
    压缩文件如果忘记密码就需要使用暴力破解的方法进行破解,因为使用了加密的手段,是无法绕过密码验证的。 cRARk是一款开源的功能强大的rar,7z类压缩软件的破解工具,支持GPU加速。 官网地址 目前有命令行版本和...
  • 1、使用7-Zip‍‍‍将一个大文件压缩成多个小的压缩包; 2、使用7-Zip将多个小的压缩包,解压/合并成一个大文件。 1、使用7-Zip‍‍‍将一个大文件压缩成多个小的压缩包 1.1 确认电脑本地已经安装“7-Zip”...
  • 再强调一下,gzip 命令只能用来压缩文件,不能压缩目录,即便指定了目录,也只能压缩目录内的所有文件。 gzip 命令的基本格式如下: [root@localhost ~]# gzip [选项] 源文件 命令中的源文件,当进行压缩操作时,...
  • 批量导出二维码并生成压缩文件

    千次阅读 2020-11-04 11:16:56
    } ps :bufferedImage和base64的互转 https://www.2loveyou.com/articles/2020/01/19/1579401149903.html 批量导出二维码并生成压缩文件 /** * 批量导出二维码 * @param machineIds * @param response */ @...
  • UglifyJS3中文文档(压缩解析js文件)

    千次阅读 2018-08-03 16:48:55
    UglifyJS可以生成一份sourcemap文件,这非常有利于你调试压缩后的JS代码。传 --source-map --output output.js 来获取sorcemap文件(sorcemap会生成为 output.js.map )。 额外选项: --source-map filename= ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,253
精华内容 23,701
关键字:

压缩文件如何分开压缩