精华内容
下载资源
问答
  • 针对WINZIP压缩文件,黑客最常使用的工具就是Elcomsoft公司的“Advanced ZIP Password Recovery”(简称AZPR),AZPR提供了一个图形化的用户界面,黑客经过几个简单的步骤就可以破解ZIP压缩文件包的密...

    压缩文件密码破解

    如果你想要破解是很难的,不知道你的密码长度有多少,破解所需的时间是根据你的密码长度来算的,方法我给你:

    1.WINZIP压缩文件的破解

    针对WINZIP压缩文件,黑客最常使用的工具就是Elcomsoft公司的“Advanced ZIP Password Recovery”(简称AZPR),AZPR提供了一个图形化的用户界面,黑客经过几个简单的步骤就可以破解ZIP压缩文件包的密码。

    第一步:配置破解工具

    首 先在“ZIP password-encrypted file”打开被加密的ZIP压缩文件包,可以利用浏览按钮或者功能键F3来选择将要解密的压缩文件包;在“Type of attack”中选择攻击方式:包括“Brute-force”(强力攻击)、“mask”(掩码搜索)、“Dictionary”(字典攻击)等;在 “Brute-force range options”设定强力攻击法的搜索范围,如果用户了解口令的组合特点,通过设定以下选择可以大大缩短搜索时间;在“Start from”中 ,当用户知道口令的起始字符序列时,可以设定该选项。例如,当用户知道口令全部使用小写字母,长度是5,并且以字母“k”开头,那么可以在该项填写 “kaaaa”,AZPR将从这个口令开始依次向后搜索所有的可能密码;在“Password length”中可以设定口令长度,这也是一个决定搜索时间的重要选项; “Auto-save”:自动存储选项的功能是定期自动保存软件当前设置与当前工作状态,这些关键参数将会定期自动保存在一个名为 “~azpr.ini”,用户可以自行指定保存参数的文件名、自动保存的时间间隔等等,该选项使得用户能够继续上次中断的解密进程。
    第二步:开始破解

    经 过以上几个关键的选项的设置,黑客就可以开始破解你的ZIP文件了,点击“Start”按钮即可进行解密运算,由于AZPR有以上保存参数和状态的功能, 用户随时可以中断或者继续运算过程。当密码找到后,用户会在结果窗口中看到密码内容、试探密码总数、破解消耗时间、平均运算速度等信息。如果没有找到密 码,也会有相应的提示信息。

    2.WINRAR压缩文件的破解

    针对WINRAR压缩文件,Elcomsoft公司也推 出了“Advanced RAR Password Recovery”,该软件解密速度很快,可以帮你找回RAR文件的密码,注册后可以解开多达128位密码。它提供有预估算出密码所需要的时间;可中断计 算与恢复继续前次的计算。然而到黑客手里也就变成了一个破解的工具,其具体使用方法与“Advanced ZIP Password Recovery”大致相同,这里不多介绍了。
    3. 当心“多功能密码破解软件”作祟

    此外,目前还有一款名为“多功能密码破 解软件”的工具值得大家注意,也是黑客经常使用的。该软件可以破解Access97/2000/xp密码,Word/Excel97/2000/xp、 QQ(本地和在线)、SQLSERVER(本地和远程)、windows98登陆密码、ZIP/RAR文件密码,星号密码察看,可以察看任何显示为*的密 码内容(网页除外)。ZIP/RAR文件密码也难逃该软件一“劫”!下面看看黑客到底是如何利用这个工具兴风作浪的。

    黑客安装并运行该软件,切换到“ZIP/RAR”选项
    点击“浏览”按钮找到本地硬盘上要破解的ZIP/RAR文件,然后需要进行以下的设置:

    (1)“破解位数设置”:你可以设置好密码最小长度和密码最大长度。

    (2)“破解字符设置”:你可以选择是用数字、小写字母、大写字母中一个或者多个,这需要根据设置的压缩包的密码来进行选择,当然,如果都选的话,那么破解的速度肯定更慢,花费的时间也更长。

    设置完毕后,点击“开始”按钮即可进行破解,经过一段时间的破解后,最后在“进度”框中显示破解的密码,
    三、巧妙设置,让压缩文件无懈可击

    除 了用来压缩文件,我们还常常把WinRAR、WINZIP当作一个加密软件来使用,在压缩文件的时候设置一个密码就可以达到保护数据的目的了。正因为如 此,专门针对压缩文件密码的破解软件也是遍地开花。密码的长短对于现在的破解软件来说,已经不是最大的障碍了。那么,怎样才可以让压缩加密的文件牢不可破 呢? 除了做好日常的安全防范工作外,我们还要巧妙进行以下设置:

    现在的破解软件在破解加密文件密码的时候总要指定一个Encrypted File(目标文件),然后根据字典使用穷举法来破解密码。但是如果我们将多个需要加密的文件压缩在一起,然后为每一个文件设置不同的密码,那破解软件就无可奈何了,具体操作如下:

    1.按照常规的方法把它压缩并且设置一个密码;
    2.准备一个其他文件(当然这个文件小一点最好了,因为我们只是利用它来迷惑破解软件而已);
    3.在WinRAR的工作窗口中打开我们第一步已经压缩好的加密文件,在“命令”菜单中选择“添加文件到压缩包”菜单选项
    4.在弹出的“请选择要添加的文件”对话框中选择我们准备的“其他文件”,点击“确定”按钮后回到“压缩文件名字和参数”对话框;

    5.在“高级”选项卡标签中点击“设置密码”按钮设置一个不同的密码,然后开始压缩即可
    经 过以上步骤,现在两个密码已经设置完成了(如果添加了多个文件,也可以给每个文件设置不同的密码,如果你担心自己会忘记,只设两个密码也可以达到目的)。 打开压缩文件可以看到每一个文件名的右上角都有一个表示加密的星号,但是打开其中不同的文件都需要相对应的密码,使用破解软件是得不到正确密码的。这种方 法对用WinZip加密的文件同样适用。

    我上网下载了rar压缩文件,有密码,用arpr工具怎么破解不了,

    ARPR这个东西很难弄到正版的,所以一般只能三位密码以内的破解,即使弄到正版的你不知道加密时用的密码库,密码位数,给你连续破一年也不一定解出来,所以最好联系加密的人。毕竟也是加了密的,自己破解也不合法

     

    用ARPR破解压缩包为什么破解的密码只有A

    你是下的那个所谓的汉化版吧...哪个版本有问题的...首先我反对这些软件...不过你想要的话留下邮箱我发给你

    如何破解RAR文件的压缩密码?

    上网找破解工具啊,下面是我Www.BKJIA.com以前收集过的不知道还能不能下,呵呵,你看看,如果不能你可以自己上网搜搜的

    多功能密码破解软件:
    http://www.onlinedown.net/soft/38220.htm

    Advanced RAR Password Recovery
    http://www.onlinedown.net/soft/8271.htm

    RAR Password Cracker
    http://www.onlinedown.net/soft/4895.htm

    Turbo ZIP Cracker V0.3
    ZIP密码暴破工具,支持由WinZIP、PKZIP以及其它兼容ZIP格式的软件(比如WinRAR等)加密的ZIP压缩包,破解速度比较理想。
    http://www.skycn.com/soft/22909.html

    展开全文
  • HDFS文件压缩

    千次阅读 2020-01-04 18:06:11
    在这种情况下,MapReduce会采用正确的做法,它不会尝试切分gzip压缩文件,因为它知道输入的时gzip压缩文件(通过文件扩展名看出)且gzip不持支切分。这是可行的,但 牺牲了数据的本地性 :一个map任务处理8个HDFS块...

    前言

    新搭建的集群,需要进行各种测试,于是让一个同事导入一些测试数据,大约1.4T左右。我进行了一个简单的hive测试

    //故意增加shuffle
    SELECT DISTINCT(COUNT id) FROM test_table;
    

    谁知道…就这么一个简单的SQL,半个小时过去后,仍然没有出结果

    追查原因

    原来同事从ftp拉取过来的数据是gzip格式的,他直接导入到Hive表中…,而gzip格式的数据是不可切分的

    如何理解不可切分

    为了进一步理解gzip等不可切分的压缩格式,我做了个测试

    • 上传测试数据
      在这里插入图片描述
      说明:
      使用linux自带的gzip将testdata(拷贝了bigtable的数据,因为直接gzip bigtable,会删除原始数据)
      或者使用:
      在这里插入图片描述
      说明:
      这样不但可以将原有的文件保留,而且可以将压缩包放到任何目录中,解压缩也一样可以看到bigtable.gz和testdata.gz大小一致

    • 在hdfs根目录创建一个data目录、

    [root@node02 data]# hadoop fs -mkdir /data
    [root@node02 data]# hadoop fs -ls /
    Found 2 items
    drwxr-xr-x   - root supergroup          0 2020-01-04 05:47 /data
    drwxrwxrwx   - root supergroup          0 2019-06-26 06:23 /tmp
    
    • 上传压缩后的数据
      由于数据太小(大约50M),仅有一个block,为了测试,自定义block块为10M:
    hadoop fs -D dfs.blocksize=10485760 -put bigtable.gz /data
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    从上图中明显可以看到:gzip格式的数据,不支持切分的真正含义,并不是说HDFS不会将文件分布式的存储在各个节点,而是在计算的时候,不支持切分,也就是仅仅有一个split,从而也就是仅有一个map,这样的效率是及其低下的。
    (后面还会更详细的讲解)
    正常支持切分的数据,执行流程如下:

    在这里插入图片描述
    而不持支切分的数据,如gzip格式的数据,就只有一个map:
    在这里插入图片描述
    这样直接导致的结果就是:
    一个map任务处理N个HDFS块,而其中大多数块并没有存储在执行该map任务的节点上,执行的效率会非常低

    既然这样,难道压缩数据就没有意义了吗?当然不是,而且在生产环境中数据都是经过压缩处理的,接下来详细讲解HDFS数据的压缩

    详解HDFS文件压缩

    • 文件压缩的两大好处
      (1)减少存储文件所需要的磁盘空间
      (2)加速数据在网络和磁盘上的传输

    • 与Hadoop结合使用的常见压缩方法

    压缩格式工具算法文件扩展名是否可切分
    DEFLATEDEFLATE.deflate
    gzipgzipDEFLATE.gz
    bzip2bzip2bzip2.bz2
    LZOlzopLZO.lzo
    LZ4LZ4.lz4
    SnappySnappy.snappy

    说明:

    1. DEFLATE是一个标准压缩算法,该算法的标准实现是zlib。没有可用于生成DEFLATE文件的常用命令行工具,因为通常都用gzip格式。注意,gzip文件格式只是在DEFLATE格式上增加了文件头和一个文件尾。.deflate扩展名是Hadoop约定的。
    2. 如果LZO文件已经在预处理过程中被索引了,那么LZO文件是可切分的。
    • 详细描述文件的压缩
      所有压缩算法都需要权衡空间/时间:压缩和解压缩速度更快,其代价通常是只能节省少量的空间。上表列出所有压缩工具都提供9个不同选项来控制压缩时必须考虑的权衡:选项-1为优化压缩速度,-9为优化压缩空间。例如,下述命令通过最快压缩方法创建一个名为file.gz的压缩文件:
      gzip -1 file
      不同压缩工具有不同的压缩特性。gzip是一个通用的压缩工具,在空间/时间性能的权衡中,属于其他两个压缩方法之间。bzip2的压缩能力强于gzip(即省空间),但压缩速度更慢一点。尽管gzip的解压速度比要锁速度快,但仍比其他压缩格式要慢一些。另一方面,LZO、LZ4和Snappy均优化压缩速度,其速度比gzip快一个数据量级,但压缩效率稍逊一筹。Snappy和LZ4的解压缩速度比LZO高出很多,通过下面的一张图更形象的看出:压缩比和压缩速度是相反的
      在这里插入图片描述
      上表中的“是否可切分”列表示对应的压缩算法是否支持切分(splitable),也就是说,是否可以搜素数据流的任意位置并进一步往下读取数据。可切分压缩格式尤其适合MapReduce(这个原因上面有讲解,下面进行更详细的描述)

    更详细的描述压缩和输入分片

    在考虑如何压缩将有MapReduce处理的数据时,理解这些压缩格式是否支持切分(splitable)是非常重要的。以一个存储在HDFS文件系统中且压缩前大小为1GB的文件为例。如果HDFS的块大小设置为128MB,那么该文件将被存储在8个块中,把这个文件作为输入数据的MapReduce作业,将创建8个输入分片,其中每个分片作为一个单独的map任务的输入被独立处理。

    现在想象一下,文件是经过gzip压缩的,且压缩后文件大小为1GB。与以前一样,HDFS将这个文件保存为8个数据块。但是,将每个数据块单独作为一个输入分片是无法实现工作的,因为无法实现从gzip压缩数据流的任意位置读取数据,所以让map任务独立与其他任务进行数据读取是行不通的。gzip格式使用DEFLATE算法来存储压缩后的数据,而DEFLATE算法将数据存储在一系列连续的压缩块中。问题在于每个块的起始位置并没有以任何形式标记,所以读取时无法从数据流的任意当前位置前进到下一块的起始位置读取下一个数据块,从而实现与整个数据流的同步。由于上述原因,gzip并不支持文件切分。

    在这种情况下,MapReduce会采用正确的做法,它不会尝试切分gzip压缩文件,因为它知道输入的时gzip压缩文件(通过文件扩展名看出)且gzip不持支切分。这是可行的,但牺牲了数据的本地性:一个map任务处理8个HDFS块,而其中大多数块并没有存储在执行该map任务的节点上。而且,map任务数量越少,作业的粒度就越大,因而运行的时间可能会更长。

    在前面假设的例子中,如果文件时通过LZO压缩的,我们会面临相同的问题,因为这个压缩格式也不支持数据读取和数据流同步。但是,在预处理LZO文件的时候使用包含在Hadoop LZO库文件中的索引工具时可能的,你可以在Google和Github网站上获得该库。该工具构建了切分点索引,如果使用恰当的MapReduce输入格式可有效实现文件的可切分特性。

    另一方面,bzip2文件提供不同数据块之间的同步标识(pi的48位近似值),因而它支持切分。可以参考前面的表,了解每个压缩格式是否支持可切分

    该使用哪种压缩格式

    Hadoop应用处理的数据集非常大,因此需要借助与压缩。使用哪种压缩格式,与待处理的文件的大小、格式和所使用的工具有关。下面有一些建议,大致是按照效率从高到底排列的。

    • 使用容器文件格式,例如顺序文件(Sequence File)、Avro数据文件、ORCFile或者Parquet文件,所有这些文件格式同时支持压缩和切分。通常最好与一个快速压缩工具联合使用,例如,LZO、LZ4或者Snappy
    • 使用支持切分的压缩格式,例如bzip2(尽管bzip2非常慢),或者使用通过索引实现切分的压缩格式,例如LZO
    • 在应用中将文件切分成块,并使用任意一种压缩格式为每个数据块建立压缩文件(不论它是否支持切分)。这种情况下,需要合理选择数据块大小,以确保压缩后的数据块的大小近似于HDFS块的大小
    • 存储未经压缩的文件

    对于大文件来说,不要使用不支持切分整个文件的压缩格式,因为会失去数据的本地性,进而造成MapReduce应用效率低下

    后记

    本文内容参考Hadoop权威指南

    展开全文
  • Java多文件压缩下载解决方案

    万次阅读 2018-09-07 18:00:33
    会员运营平台经过改版后页面增加了许多全部下载链接,上周上线比较仓促,全部下载是一个直接下载ZIP压缩文件的链接,每个ZIP压缩文件都是由公司运营人员将页面需要下载的文件全部压缩成一个ZIP压缩文件,然后通过...

    Java多文件压缩下载解决方案

    需求:

    会员运营平台经过改版后页面增加了许多全部下载链接,上周上线比较仓促,全部下载是一个直接下载ZIP压缩文件的链接,每个ZIP压缩文件都是由公司运营人员将页面需要下载的文件全部压缩成一个ZIP压缩文件,然后通过公司的交易运营平台上传至文件资料系统,会员运营平台则可以直接获取ZIP压缩文件地址进行下载

    下面是一个页面示例:

    需求分析:

    通过上面需求和页面可以分析出,公司运营人员将页面全部需要下载的文件进行ZIP压缩后上传文件资料系统确实是一个紧急的解决方案,但是考虑到后面需求变更,页面需要下载的文件也会跟着变更,每次变更需求,公司运营人员都需要重新进行压缩文件,程序也需要进行相应的修改,这样对于程序的维护性不友好,站在使用系统的客户角度,每次都需要重新上传,因此临时解决方案不再符合软件的良好扩展性和操作方便,因此才有了对页面需要全部下载的文件使用程序压缩处理并下载。

     

    解决思路:

    第一步:前端传递Ids字符串

    由于会员运营系统显示需要下载的文件是资料系统中的每条文件记录的Id,因此前端页面只需要将需要下载的所有文件Ids字符串(比如:'12,13,14')传递到后台即可.

    第二步:后台处理

    首先获取到前端传递的ids字符串,将其转换为Integer[]的ids数组,然后调用文件资料微服务根据id列表查询对应的文件记录(包含文件类型和文件地址路径等信息),获取到所有需要下载的文件路径后压缩成ZIP格式的文件进行下载。

     

    具体实现压缩下载方案:

    第一种:先压缩成ZIP格式文件,再下载

    第二种:边压缩ZIP格式文件边下载(直接输出ZIP流)

     

    前端具体实现代码:

    由于全部下载是一个a链接标签,于是使用Ajax异步下载,后来功能实现后点击下载一点反应都没有,一度怀疑是后台出错,但是后台始终没有报错,在网上看了一下Ajax异步不能下载文件(也就是Ajax不支持流类型数据),具体原因可以百度https://blog.csdn.net/qq_16877261/article/details/54376430这篇博客,解释的还算是比较好的。后面会写一篇=文章详细分析Ajax异步下载解决方案。

    接下来考虑使用form表单标签实现,最终配合使用input标签实现了前端传递ids列表的问题,点击a链接标签触发提交form标签即可。

    在每一个需要下载的文件增加一个隐藏的input标签,value值是这个文件的id值

    具体点击a链接标签提交表单的JS代码:

     

    后端具体实现代码:

    第一种方案实现:

    第二种方案实现:

    附上完整代码:

    压缩下载Controller

    package com.huajin.jgoms.controller.user;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
    import java.util.Objects;
    import java.util.stream.Collectors;
    
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.collections.CollectionUtils;
    import org.apache.commons.lang3.ObjectUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.huajin.baymax.logger.XMsgError;
    import com.huajin.baymax.logger.Xlogger;
    import com.huajin.common.util.UUIDUtil;
    import com.huajin.exchange.domain.sys.FeFileCenter;
    import com.huajin.exchange.enums.sys.SysParamKey;
    import com.huajin.exchange.po.sys.SysParamPo;
    import com.huajin.jgoms.controller.HjBaseController;
    import com.huajin.jgoms.service.FeFileCenterService;
    import com.huajin.jgoms.service.SysParamService;
    import com.huajin.jgoms.util.CompressDownloadUtil;
    
    /**
     * 压缩下载文件
     *
     * @author hongwei.lian
     * @date 2018年9月6日 下午6:29:05
     */
    @Controller
    @RequestMapping("/compressdownload")
    public class CompressDownloadController extends HjBaseController {
    	
    	@Autowired
    	private FeFileCenterService feFileCenterService;
    	
    	@Autowired
    	private SysParamService sysParamService;
    
    	/**
    	 * 多文件压缩下载
    	 * 
    	 * @author hongwei.lian
    	 * @date 2018年9月6日 下午6:28:56
    	 */
    	@RequestMapping("/downloadallfiles")
    	public void downloadallfiles() {
    		//-- 1、根据ids查询下载的文件地址列表
    		String ids = request().getParameter("ids");
    		if (StringUtils.isEmpty(ids)) {
    			return ;
    		}
    		//-- 将字符串数组改变为整型数组
    		Integer[] idsInteger = CompressDownloadUtil.toIntegerArray(ids);
    		List<FeFileCenter> fileCenters = feFileCenterService.getFeFileByIds(super.getExchangeId(), idsInteger);
    		if (CollectionUtils.isNotEmpty(fileCenters) && ObjectUtils.notEqual(idsInteger.length, fileCenters.size())) {
    			//-- 要下载文件Id数组个数和返回的文件地址个数不一致
    			return ;
    		}
    		
    		//-- 2、转换成文件列表
    		List<File> files = this.toFileList(fileCenters);
    		//-- 检查需要下载多文件列表中文件路径是否都存在
    		for (File file : files) {
    			if (!file.exists()) {
    				//-- 需要下载的文件中存在不存在地址
    				return ;
    			}
    		}
    		
    		//-- 3、响应头的设置
    		String downloadName = UUIDUtil.getUUID() + ".zip";
    		HttpServletResponse response = CompressDownloadUtil.setDownloadResponse(super.response(), downloadName);
    		
    		//-- 4、第一种方案:
    		//-- 指定ZIP压缩包路径
    //		String zipFilePath = this.setZipFilePath(downloadName);
    //		try {
    //			//-- 将多个文件压缩到指定路径下
    //			CompressDownloadUtil.compressZip(files, new FileOutputStream(zipFilePath));
    //			//-- 下载压缩包
    //			CompressDownloadUtil.downloadFile(response.getOutputStream(), zipFilePath);
    //			//-- 删除临时生成的ZIP文件
    //			CompressDownloadUtil.deleteFile(zipFilePath);
    //		} catch (IOException e) {
    //			Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadallfiles", e));
    //		}
    		
    		//-- 5、第二种方案:
    	   try {
    		    //-- 将多个文件压缩写进响应的输出流
    			CompressDownloadUtil.compressZip(files, response.getOutputStream());
    		} catch (IOException e) {
    			Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadallfiles", e));
    		}
    		
    	}
    
    	/**
    	 * 设置临时生成的ZIP文件路径
    	 *
    	 * @param fileName
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:54:13
    	 */
    	private String setZipFilePath(String fileName) {
    		String zipPath = sysParamService.getCompressDownloadFilePath();
    		File zipPathFile = new File(zipPath);
    		if (!zipPathFile.exists()) {
    			zipPathFile.mkdirs();
    		}
    		return zipPath + File.separator + fileName;
    	}
    
    	/**
    	 * 将fileCenters列表转换为File列表
    	 *
    	 * @param fileCenters
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月6日 下午6:54:16
    	 */
    	private List<File> toFileList(List<FeFileCenter> fileCenters) {
    		return fileCenters.stream()
                                         .map(feFileCenter -> {
                                        	 //-- 获取每个文件的路径
                                        	 String filePath = this.getSysFilePath(feFileCenter.getFileTypeId());
                                             return new File(filePath + feFileCenter.fileLink());})
                                         .collect(Collectors.toList());
    	}
    	
    	/**
    	 * 获取文件类型对应存储路径
    	 *
    	 * @param fileTypeId
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月5日 下午2:01:53
    	 */
    	private String getSysFilePath(Integer fileTypeId){
    		SysParamPo sysmParam = sysParamService.getByParamKey(SysParamKey.FC_UPLOAD_ADDRESS.value);
    		String filePath = Objects.nonNull(sysmParam) ? sysmParam.getParamValue() : "";
    		return filePath + fileTypeId + File.separator;
    	}
    
    }

    压缩下载工具类

    package com.huajin.jgoms.util;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Objects;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    import javax.servlet.http.HttpServletResponse;
    
    import com.huajin.baymax.logger.XMsgError;
    import com.huajin.baymax.logger.Xlogger;
    
    /**
     * 压缩下载工具类
     *
     * @author hongwei.lian
     * @date 2018年9月6日 下午6:34:56
     */
    public class CompressDownloadUtil {
    	
    	private CompressDownloadUtil() {}
    	
    	/**
    	 * 设置下载响应头
    	 *
    	 * @param response
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:01:59
    	 */
    	public static HttpServletResponse setDownloadResponse(HttpServletResponse response, String downloadName) {
    		response.reset();
    		response.setCharacterEncoding("utf-8");
    		response.setContentType("application/octet-stream");
    		response.setHeader("Content-Disposition", "attachment;fileName*=UTF-8''"+ downloadName);
    		return response;
    	}
    	
    	/**
    	 * 字符串转换为整型数组
    	 *
    	 * @param param
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月6日 下午6:38:39
    	 */
    	public static Integer[] toIntegerArray(String param) {
    		return Arrays.stream(param.split(","))
                                  .map(Integer::valueOf)
                                  .toArray(Integer[]::new);
    	}
    	
    	/**
    	 * 将多个文件压缩到指定输出流中
    	 *
    	 * @param files 需要压缩的文件列表
    	 * @param outputStream  压缩到指定的输出流
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:11:59
    	 */
    	public static void compressZip(List<File> files, OutputStream outputStream) {
    		ZipOutputStream zipOutStream = null;
    		try {
    			//-- 包装成ZIP格式输出流
    			zipOutStream = new ZipOutputStream(new BufferedOutputStream(outputStream));
    			// -- 设置压缩方法
    			zipOutStream.setMethod(ZipOutputStream.DEFLATED);
    			//-- 将多文件循环写入压缩包
    			for (int i = 0; i < files.size(); i++) {
    				File file = files.get(i);
    				FileInputStream filenputStream = new FileInputStream(file);
    				byte[] data = new byte[(int) file.length()];
    				filenputStream.read(data);
    				//-- 添加ZipEntry,并ZipEntry中写入文件流,这里,加上i是防止要下载的文件有重名的导致下载失败
    				zipOutStream.putNextEntry(new ZipEntry(i + file.getName()));
    				zipOutStream.write(data);
    				filenputStream.close();
    				zipOutStream.closeEntry();
    			}
    		} catch (IOException e) {
    			Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadallfiles", e));
    		}  finally {
    			try {
    				if (Objects.nonNull(zipOutStream)) {
    					zipOutStream.flush();
    					zipOutStream.close();
    				}
    				if (Objects.nonNull(outputStream)) {
    					outputStream.close();
    				}
    			} catch (IOException e) {
    				Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadallfiles", e));
    			}
    		}
    	}
    	
    	/**
    	 * 下载文件
    	 *
    	 * @param outputStream 下载输出流
    	 * @param zipFilePath 需要下载文件的路径
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:27:08
    	 */
    	public static void downloadFile(OutputStream outputStream, String zipFilePath) {
    		File zipFile = new File(zipFilePath);
    		if (!zipFile.exists()) {
    			//-- 需要下载压塑包文件不存在
    			return ;
    		}
    		FileInputStream inputStream = null;
    		try {
    			inputStream = new FileInputStream(zipFile);
    			byte[] data = new byte[(int) zipFile.length()];
    			inputStream.read(data);
    			outputStream.write(data);
    			outputStream.flush();
    		} catch (IOException e) {
    			Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadZip", e));
    		} finally {
    			try {
    				if (Objects.nonNull(inputStream)) {
    					inputStream.close();
    				}
    				if (Objects.nonNull(outputStream)) {
    					outputStream.close();
    				}
    			} catch (IOException e) {
    				Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadZip", e));
    			}
    		}
    	}
    	
    	/**
    	 * 删除指定路径的文件
    	 *
    	 * @param filepath 
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:44:53
    	 */
    	public static void deleteFile(String filepath) {
    		File file = new File(filepath);
    		deleteFile(file);
    	}
    	
    	/**
    	 * 删除指定文件
    	 *
    	 * @param file 
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:45:58
    	 */
    	public static void deleteFile(File file) {
    		//-- 路径为文件且不为空则进行删除  
    	    if (file.isFile() && file.exists()) {  
    	        file.delete();  
    	    } 
    	}
    
    }
    

    测试

    通过交易运营平台上传测试资料

    登录会员运营平台进行下载

    下载下来的ZIP格式为文件

    解压后,打开文件是否可用:

     

    总结:

    这个过程中出现了很多问题,后面会有文章逐步分析出错和解决方案。

    上述两种方案都行,但是为了响应速度更快,可以省略压缩成ZIP的临时文件的时间,因此采用了第二种解决方案。

     

    展开全文
  • 哈夫曼实现文件压缩压缩(c语言)

    万次阅读 多人点赞 2019-01-23 17:04:47
    写一个对文件进行压缩和解压缩的程序,功能如下: ① 可以对纯英文文档实现压缩和解压; ② 较好的界面程序运行的说明。 介绍哈夫曼: 效率最高的判别树即为哈夫曼树 在计算机数据处理中,霍夫曼编码...

    写一个对文件进行压缩和解压缩的程序,功能如下:

    ① 可以对纯英文文档实现压缩和解压;

    ② 较好的界面程序运行的说明。

     

     

    介绍哈夫曼:

     

    效率最高的判别树即为哈夫曼树

    在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。

    例如,在英文中,e的出现机率最高,而z的出现概率则最低。当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26)。用普通的表示方法时,每个英文字母均占用一个字节,即8个比特。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。

    霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明霍夫曼树的WPL是最小的。

     

    文件压缩与解压

    姓名:  范天祚 

    1 程序说明

    1.1数据结构

    哈夫曼树

    1.2函数功能说明

    printfPercent界面

    compress()读取文件内容并加以压缩,将压缩内容写入另一个文档

    uncompress()解压缩文件,并将解压后的内容写入新文件

    1.3 程序编写的思路及流程

    压缩:统计字符出现次数、将节点按出现次数排序、构造哈夫曼树、设置字符编码、读文件字符、按设置好的编码替换字符、写入存储文件

    解压:读取文件各参数、转换成二进制码、按码求对应字符、写入存储文件

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    struct head
    {
        int b;						  //字符
        long count;                   //文件中该字符出现的次数
        long parent, lch, rch;        //make a tree
        char bits[256];               //the huffuman code
    };
    
    struct head header[512], tmp;  //节点树
    
    void printfPercent(int per)
    {
    	int i = 0;
    	printf("|");
    	for(i = 0; i < 10; i++)
    	{
    		if(i < per/10)
    			printf(">");
    		else
    			printf("-");
    	}
    	printf("|已完成%d%%\n",per);
    }
    
    //函数:compress()
    //作用:读取文件内容并加以压缩
    //将压缩内容写入另一个文档
    int compress(const char *filename,const char *outputfile)
    {
        char buf[512];
        unsigned char c;
        long i, j, m, n, f;
        long min1, pt1, flength;
        FILE *ifp, *ofp;
    	int per = 10;
        ifp = fopen(filename, "rb");                  //打开原始文件
        if (ifp == NULL)
        {
            printf("打开文件失败:%s\n",filename);
            return 0;                             //如果打开失败,则输出错误信息
        }
        ofp = fopen(outputfile,"wb");                 //打开压缩后存储信息的文件
        if (ofp == NULL)
        {
            printf("打开文件失败:%s\n",outputfile);
            return 0;
        }
        flength = 0;
        while (!feof(ifp))
        {
            fread(&c, 1, 1, ifp);
            header[c].count ++;                       //读文件,统计字符出现次数
            flength ++;                               //记录文件的字符总数
        }
        flength --;
        header[c].count --;
        for (i = 0; i < 512; i ++)                    //HUFFMAN算法中初始节点的设置
        {
            if (header[i].count != 0)
                header[i].b = (unsigned char) i;
            else
                header[i].b = -1;
            header[i].parent = -1;
            header[i].lch = header[i].rch = -1;
        }
    
        for (i = 0; i < 256; i ++)                    //将节点按出现次数排序
        {
            for (j = i + 1; j < 256; j ++)
            {
                if (header[i].count < header[j].count)
                {
                    tmp = header[i];
                    header[i] = header[j];
                    header[j] = tmp;
                }
            }
        }
    
    
        for (i = 0; i < 256; i ++)                    //统计不同字符的数量
    	{
            if (header[i].count == 0)
                break;
    	}
    
        n = i;
        m = 2 * n - 1;
        for (i = n; i < m; i ++)
        {
            min1 = 999999999;
            for (j = 0; j < i; j ++)
            {
                if (header[j].parent != -1) continue;
                if (min1 > header[j].count)
                {
                    pt1 = j;
                    min1 = header[j].count;
                    continue;
                }
            }
            header[i].count = header[pt1].count;
            header[pt1].parent = i;
            header[i].lch = pt1;
            min1 = 999999999;
            for (j = 0; j < i; j ++)
            {
                if (header[j].parent != -1) continue;
                if (min1 > header[j].count)
                {
                    pt1 = j;
                    min1 = header[j].count;
                    continue;
                }
            }
            header[i].count += header[pt1].count;
            header[i].rch = pt1;
            header[pt1].parent = i;
        }
    
        for (i = 0; i < n; i ++)                        //构造HUFFMAN树,设置字符的编码
        {
            f = i;
            header[i].bits[0] = 0;
            while (header[f].parent != -1)
            {
                j = f;
                f = header[f].parent;
                if (header[f].lch == j)
                {
                    j = strlen(header[i].bits);
                    memmove(header[i].bits + 1, header[i].bits, j + 1);
                    header[i].bits[0] = '0';
                }
                else
                {
                    j = strlen(header[i].bits);
                    memmove(header[i].bits + 1, header[i].bits, j + 1);
                    header[i].bits[0] = '1';
                }
            }
        }
    
        //下面的就是读原文件的每一个字符,按照设置好的编码替换文件中的字符
        fseek(ifp, 0, SEEK_SET);                                                //将指针定在文件起始位置
        fseek(ofp, 8, SEEK_SET);                                //以8位二进制数为单位进行读取
        buf[0] = 0;
        f = 0;
        pt1 = 8;
    
    	printf("读取将要压缩的文件:%s\n",filename);
    	printf("当前文件有:%d字符\n",flength);
    	printf("正在压缩\n");
    
        while (!feof(ifp))
        {
            c = fgetc(ifp);
            f ++;
            for (i = 0; i < n; i ++)
            {
                if (c == header[i].b) break;
            }
            strcat(buf, header[i].bits);
            j = strlen(buf);
            c = 0;
            while (j >= 8)                                             //当剩余字符数量不小于8个时
            {
                for (i = 0; i < 8; i ++)                               //按照八位二进制数转化成十进制ASCII码写入文件一次进行压缩
                {
                    if (buf[i] == '1') c = (c << 1) | 1;
                    else c = c << 1;
                }
                fwrite(&c, 1, 1, ofp);
                pt1 ++;
                strcpy(buf, buf + 8);
                j = strlen(buf);
            }
    		if(100 * f/flength > per)
    		{
    			printfPercent(per);
    			per += 10;
    		}
            if (f == flength)
    			break;
        }
    	printfPercent(100);
    
        if (j > 0)                                                      //当剩余字符数量少于8个时
        {
            strcat(buf, "00000000");
            for (i = 0; i < 8; i ++)
            {
                if (buf[i] == '1') c = (c << 1) | 1;
                else c = c << 1;                                        //对不足的位数进行补零
            }
            fwrite(&c, 1, 1, ofp);
            pt1 ++;
        }
        fseek(ofp, 0, SEEK_SET);                                        //将编码信息写入存储文件
    	fwrite(&flength,1,sizeof(flength),ofp);
        fwrite(&pt1, sizeof(long), 1, ofp);
        fseek(ofp, pt1, SEEK_SET);
        fwrite(&n, sizeof(long), 1, ofp);
        for (i = 0; i < n; i ++)
        {
    		tmp = header[i];
    
            fwrite(&(header[i].b), 1, 1, ofp);
    		pt1++;
            c = strlen(header[i].bits);
            fwrite(&c, 1, 1, ofp);
    		pt1++;
            j = strlen(header[i].bits);
    
            if (j % 8 != 0)                                             //当位数不满8时,对该数进行补零操作
            {
                for (f = j % 8; f < 8; f ++)
                    strcat(header[i].bits, "0");
            }
    
            while (header[i].bits[0] != 0)
            {
                c = 0;
                for (j = 0; j < 8; j ++)
                {
                    if (header[i].bits[j] == '1') c = (c << 1) | 1;
                    else c = c << 1;
                }
                strcpy(header[i].bits, header[i].bits + 8);
                fwrite(&c, 1, 1, ofp);                                            //将所得的编码信息写入文件
    			pt1++;
            }
    
    		header[i] = tmp;
        }
        fclose(ifp);
        fclose(ofp);                                                              //关闭文件
    
    	printf("压缩后文件为:%s\n",outputfile);
        printf("压缩后文件有:%d字符\n",pt1 + 4);
    
        return 1;                                       //返回压缩成功信息
    }
    
    
    //函数:uncompress()
    //作用:解压缩文件,并将解压后的内容写入新文件
    int uncompress(const char *filename,const char *outputfile)
    {
        char buf[255], bx[255];
        unsigned char c;
    	char out_filename[512];
        long i, j, m, n, f, p, l;
        long flength;
    	int per = 10;
    	int len = 0;
        FILE *ifp, *ofp;
    	char c_name[512] = {0};
        ifp = fopen(filename, "rb");                                              //打开文件
        if (ifp == NULL)
        {
            return 0;     //若打开失败,则输出错误信息
        }
    
    													  //读取原文件长
    	if(outputfile)
    		strcpy(out_filename,outputfile);
    	else
    		strcpy(out_filename,c_name);
    
        ofp = fopen(out_filename, "wb");                                            //打开文件
        if (ofp == NULL)
        {
            return 0;
        }
    
    	fseek(ifp,0,SEEK_END);
    	len = ftell(ifp);
    	fseek(ifp,0,SEEK_SET);
    
    	printf("将要读取解压的文件:%s\n",filename);
    	printf("当前文件有:%d字符\n",len);
    	printf("正在解压\n");
    
        fread(&flength, sizeof(long), 1, ifp);                                    //读取原文件长
        fread(&f, sizeof(long), 1, ifp);
        fseek(ifp, f, SEEK_SET);
        fread(&n, sizeof(long), 1, ifp);                                          //读取原文件各参数
        for (i = 0; i < n; i ++)                                                  //读取压缩文件内容并转换成二进制码
        {
            fread(&header[i].b, 1, 1, ifp);
            fread(&c, 1, 1, ifp);
            p = (long) c;
            header[i].count = p;
            header[i].bits[0] = 0;
            if (p % 8 > 0) m = p / 8 + 1;
            else m = p / 8;
            for (j = 0; j < m; j ++)
            {
                fread(&c, 1 , 1 , ifp);
                f = c;
                _itoa(f, buf, 2);
                f = strlen(buf);
                for (l = 8; l > f; l --)
                {
                    strcat(header[i].bits, "0");                                  //位数不足,执行补零操作
                }
                strcat(header[i].bits, buf);
            }
            header[i].bits[p] = 0;
        }
    
        for (i = 0; i < n; i ++)
        {
            for (j = i + 1; j < n; j ++)
            {
                if (strlen(header[i].bits) > strlen(header[j].bits))
                {
                    tmp = header[i];
                    header[i] = header[j];
                    header[j] = tmp;
                }
            }
        }
    
        p = strlen(header[n-1].bits);
        fseek(ifp, 8, SEEK_SET);
        m = 0;
        bx[0] = 0;
    
    
        while (1)
        {
            while (strlen(bx) < (unsigned int)p)
            {
                fread(&c, 1, 1, ifp);
                f = c;
                _itoa(f, buf, 2);
                f = strlen(buf);
                for (l = 8; l > f; l --)
                {
                    strcat(bx, "0");
                }
                strcat(bx, buf);
            }
            for (i = 0; i < n; i ++)
            {
                if (memcmp(header[i].bits, bx, header[i].count) == 0) break;
            }
            strcpy(bx, bx + header[i].count);
            c = header[i].b;
            fwrite(&c, 1, 1, ofp);
            m ++;
    
    		if(100 *  m/flength > per)
    		{
    			printfPercent(per);
    			per += 10;
    		}
            if (m == flength) break;
        }
    	printfPercent(100);
    
        fclose(ifp);
        fclose(ofp);
    
    	printf("解压后文件为:%s\n",out_filename);
        printf("解压后文件有:%d字符\n",flength);
    
        return 1;                   //输出成功信息
    }
    
    int main(int argc,const char *argv[])
    {
    	memset(&header,0,sizeof(header));
        memset(&tmp,0,sizeof(tmp));
    
    	compress("测试文档.txt","测试文档.txt.zip");
    	uncompress("测试文档.txt.zip","测试文档.txt 解压后.txt");
    	system("pause");
    
    	return 0;
    }
    

     

    2 功能展示

    2.1 控制台显示

    2.2 文件效果

    开始时只有一个文件《测试文档.txt》:

    打开《测试文档.txt》

    《测试文档.txt》文件大小:

    程序运行结束后多了两个文件:

    以文本形式打开压缩二进制文件《测试文档.txt.zip》:

    《测试文档.txt.zip》文件属性:

    展开全文
  • Linux上压缩文件的 5 种方法

    千次阅读 2020-07-03 14:05:53
    在 Linux 上有不少用于压缩文件的命令。最新最有效的一个方法是 xz,但是所有的方法都有节省磁盘空间和维护备份文件供以后使用的优点。在这篇文章中,我们将比较这些压缩命令并指出显著的不同。 tar  tar 命令不是...
  • java 实现压缩单个文件

    千次阅读 2018-07-29 22:13:59
    先来实现一个简单的单文件压缩,主要是为了解一下压缩需要使用到的流。。 效果: 说明:压缩实现使用ZipOutputStream 代码: package com.gx.compress; import java.io.BufferedInputStream; import java....
  • Zlib文件压缩和解压

    千次阅读 2018-08-18 15:54:29
    打开欲压缩文件时文件的指针  FILE *  fp1;  // 创建压缩文件时的指针   errno_t err;  // 错误变量的定义 #ifdef WINDOWS_PLATFORM  err  =  fopen_s( & ...
  • 方法就行了,但是很多情况下却删除不了,下面列举一些情况;1.是文件夹且不为空,这个没什么好说的,可以先删除文件夹里的文件再删除这个文件夹;2.被别的进程占用,这不仅java不能删,就算windows手动删也删不了;3...
  • qt在linux系统下实现压缩文件

    千次阅读 2019-01-15 15:10:18
    编程进行文件压缩一般有三种方法: 一是使用zlib的C++开源源码; 二是使用Quazip动态库; 三就是在子进程中使用第三方软件。 由于在windows中开发qt程序使用了zlib源码库;而linux下的命令行操作又如此简单。这里用...
  • 前端性能优化 压缩静态文件gzip

    千次阅读 2018-10-16 10:41:09
    前端压缩的方式很多,依赖java的有ant工具,前端自己打包压缩的有grunt,gulp,webpack,这些压缩也很重要,基本上能压缩50%以上,下面我们对压缩文件来个对比。 如图所示,这是未压缩的         ...
  • Linux 下如何压缩/解压缩文件

    千次阅读 2018-08-28 10:08:31
    Linux 下比较常用的压缩文件 为zip类的压缩文件下面介绍下如何压缩文件。 使用cd命令切换到要压缩文件的目录 使用 zip -q -r 压缩后的文件.zip 文件名 即可压缩。 当然不切换到目录也可以,使用pwd 查看出...
  • 方法一:使用第三方软件-文件全能王首先在微信上下载后点击用其他应用打开然后弹出下面界面,往右滑动,点击拷贝到文件全能王接着该软件会自动打开并载入要解压的文件,单击压缩文件在弹出的弹框中点击确定解压最后...
  • Android中文件压缩和解压缩

    万次阅读 2017-03-06 01:08:43
    使用场景当我们在应用的Assets目录中需要加入文件时,可以直接将源文件放入,但这样会造成打包后的apk整体过大,此时就需要将放入的文件...下面我们就学习下基本的文件压缩和解压缩.Java中提供了压缩和解压缩的输入输出流
  • 用python进行批量文件的解压缩/压缩批量文件7z的命令行参数7z压缩文件的命令行参数7z解压文件的命令行参数 7z的命令行参数 python可以通过subprocess模块的相关函数运行外部程序,完成一些操作。如本文要介绍的...
  • java代码压缩文件

    千次阅读 2018-08-06 14:12:26
    1、文件压缩需要利用ZipOutputStream类对象,可将文件压缩为.zip文件。ZipOutputStream类的构造方法如下:ZipOutputStream(outputStream out); 2、ZipOutputStream类的常用方法如表所示。 方法 返回值 说明 ...
  • 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(默认转换到...
  • 压缩文件并删除源文件

    千次阅读 2018-10-24 12:35:02
    gzip * //压缩文件,并自动删除源文件。不支持直接压缩目录 gzip -rv 目录名 //递归的压缩目录  下面是执行记录: [root@wx-app-160 test]# ls -lrt total 4 -rw-r--r--. 1 root root 0 Oct 24 12:14 aa.tx....
  • Linux环境下,文件压缩/解压

    千次阅读 2019-07-22 19:32:36
    一、zip格式 zip可能是目前使用的最多的文档压缩格式。...压缩一个zip文件(命令): zip-r newfilename.zip filename (-r是压缩文件,newfilename.zip是指压缩之后的文件名称,filename是指要压缩的...
  • 可以用来压缩打包单文件、多个文件、单个目录、多个目录。 Linux打包命令_tar tar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。 常用格式: 单个文件压缩打包 tar czvf my.tar.gz file1 多个...
  • MP4视频格式相信是大家接触的最多的一种视频格式...其实方法很简单,下面将MP4视频压缩的方法分享给大家,一起来看看吧!  使用工具:迅捷压缩  工具介绍:迅捷压缩软件是一款集图片压缩、PDF压缩、视频压缩于一...
  • Python创建压缩文件

    千次阅读 2019-01-17 10:59:10
    -----转载国外课栈网 Python允许您快速创建zip / tar...下面的命令让你控制上要存档,文件 ZipFile.write(filename) 在这里是在Python中创建Zip文件的步骤 步骤1) 要从Python创建存档文件,确保您的import语句正...
  • 基于Huffman树的文件压缩(详细)

    千次阅读 多人点赞 2018-08-16 16:44:42
    文件压缩 开发平台:Visual Studio 2008 开发技术:哈夫曼树,堆排序 项目流程: (1)统计要压缩文件中各字符出现的次数,利用数据结构中的小堆来构建Huffman树,每次在堆顶选出两个出现次数较小的字符先进行...
  • 为什么很多压缩文件上都有这个东西? 有时候我们在网上下载文件的时候,会碰到这样一种情况,网站不仅给出了文件的大小,还给出了一个MD5码,这个MD5码是什么东西。 MD5是什么 MD5是MD5消息摘要算法的简称(英语:MD...
  • C++四个文件实现压缩压缩zip文件

    万次阅读 2018-07-09 19:43:24
    压缩和解压缩在开发中很常见,比较知名的第三方库就是zlib。最下的文档中给出了zlib源码的下载地址,感兴趣的朋友可以下载下。我从网上找到了一个很简单的zip,unzip接口,只有四个文件,直接放到工程中就可以用了。...
  • 一般来说,微信中的视频文件使用手机发送是比较方便的,但是因为有限制,所以想要进行文件传输那么就需要减少文件的大小,最简单的方法就是压缩视频文件! 1.使用手机压缩视频文件,当然是需要第三方软件的支持,...
  • Linux文件文件系统的压缩与打包

    千次阅读 2016-04-23 23:31:37
    Linux文件与文件系统的压缩与打包进来在学习Linux了,不过Linux的命令太多了,怕记不住所以使用博客记录的方式来写下自己的学习过程,以后忘记了还可以翻阅... Linux的环境下,压缩文件大多扩展名是*.tar, *.tar,*.gz
  • 如何生成压缩文件文件(zip)

    千次阅读 2017-09-07 09:33:42
    在做项目的过程中需要将文件打成压缩包 供用户下载使用,所以借鉴了网上的部分代码,经过自己的整理已进行了应用,代码如下: package com.zzxb.zip; import java.io.BufferedInputStream; import java.io....
  • C++ 压缩文件及文件夹 使用zlib开源库

    万次阅读 热门讨论 2017-09-11 12:50:55
    C++ 压缩文件及文件夹 使用zlib开源库  使用zlib-1.2.11版本的开源库,实现我需要的对文件或者文件夹的压缩,查阅了一些博客大牛的资料,后面根据自己的需要修改。下面给出我的代码: #include "stdafx.h" #...
  • linux下面的解压缩文件的命令

    千次阅读 2013-06-22 01:24:00
    尝试去好好用linux、新手起步。 这边只会提到我用过的、其他相关的... 3、f-文件-file 4、x-解压-extract 5、z-gz格式  66666、真不会用语法的就使用man...例如 man tar 他就会给你现实tar的一些参数操作 ...
  • Centos7 压缩文件

    千次阅读 2018-04-17 13:19:03
    压缩文件命令:tar選項與參數: -c :建立打包檔案,可搭配 -v 來察看過程中被打包的檔名(filename) -t :察看打包檔案的內容含有哪些檔名,重點在察看『檔名』就是了; -x :解打包或解壓縮的功能,可以搭配 -C (大...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 443,572
精华内容 177,428
关键字:

下面是压缩文件的是