精华内容
下载资源
问答
  • 在我们的日常生活中,很大一部分人在使用Android手机拍摄高质量的视频,以记录和分享我们生活的美好...有许多适用于Android文件压缩器,进一步了解如何在Android压缩文件,请阅读本文。第1部分.压缩视频/音频文...

    在我们的日常生活中,很大一部分人在使用Android手机拍摄高质量的视频,以记录和分享我们生活的美好时光。但是这些高清视频在我们的手机上占用了太多空间,因此我们不得不忍痛删除一些视频。要在我们的Android设备上存储最大数量的视频,图像和音频文件,压缩和减小它们的大小非常重要。有许多适用于Android的文件压缩器,进一步了解如何在Android上压缩文件,请阅读本文。

    第1部分.压缩视频/音频文件-万兴优转

    要确保以超快的速度进行无损质量压缩文件,在这里我们强烈推荐<a href="https://uniconverter.wondershare.cn/"> 万兴优转 。该视频工具箱支持1000多种格式的转换和其他功能。可以更改添加视频和音频文件的帧率和比特率,质量和分辨率,以减小文件的大小。

    [官网]万兴优转 - 音视频格式转换&视频压缩&视频录制&DVD刻录全能视频格式转换器uniconverter.wondershare.cn
    5d744c80173029303556bf7c079cf309.png

    步骤1:启动万兴优转

    安装后在PC上打开万兴优转,首先选择上方的压缩选项,然后可以单击+添加文件按钮来浏览和导入文件。

    7bc937615587c01b5a15f6b7f99b6262.png

    步骤2:自定义视频输出设置以压缩视频文件

    在目标文件栏的下方,点击图标即可一个个将视频压缩。一个新的设置窗口将会打开,您可以在这里设置文件大小、分辨率、质量和比特率。点击预览按钮即可查看视频压缩后的前20秒效果。最后,点击确认按钮保存视频压缩设置。

    9bf9d8a64b4cd8a42de7cac459ccc2fd.png
    • 进度条: 直接移动进度条将会重置视频大小。文件大小、质量、以及比特率将会随进度条移动而改变。
    • 文件大小: 您可以随意改变文件大小只需输入数字或点击 按钮。
    • 分辨率: 点击 按钮即可从下拉式菜单里选择视频分辨率。
    • 质量: 这里将会根据压缩视频的文件大小提醒您输出的视频将会是低质量、中等质量或高质量。
    • 比特率: 这里会根据视频大小显示视频的比特率。

    步骤3:开始压缩文件

    现在您可以在程序的主界面预览文件的大小。点击压缩全部按钮即可开始将所有视频立刻压缩。压缩完毕后,您可以到压缩完成标签页查看压缩完毕的视频。

    0910d1843f32903a8d76d64dcd84bc02.png

    第2部分.有关在Android上压缩文件的4种方法

    1. RAR

    这是RARLAB开发的,是Google Play商店中受好评的应用程序之一,它以简单快捷的方式促进了文件压缩。该应用程序还可以用作体面的提取器,文件浏览器,存档器,助手和管理器。该应用程序能够创建添加文件的RAR和ZIP格式。有一个选项可以解压缩许多档案,包括TAR,ISO,ARJ,RAR,GZ等。其他功能包括恢复记录,加密,利用多个CPU内核进行数据压缩,出售的档案等。

    f853b2adfe37de3140da525c1aabc6f3.png

    2. ZArchiver

    这是另一个适用于Android设备的不错的存档管理应用程序,它支持多种功能。该应用程序带有功能界面,可帮助创建一系列归档类型,包括7z,tar,zip,gzip等。还提供用于解压缩不同存档类型的选项。使用该应用程序,您可以创建和解压缩受密码保护的档案,打开压缩文件,从邮件应用程序中打开档案,解压缩部分档案,编辑档案,然后提取分割的档案。该应用程序还提供了多线程支持,并且在使用该应用程序时无需启用多选模式。

    fbc9ba2b8a004996e0b4feabaa9d5640.png

    3. WinZip

    这是WinZip Computing开发的,它是Android应用程序之一,用于在Android设备上创建,提取和共享zip文件。该应用程序允许创建Zip和Zipx文件,并便于解压缩RAR,ZIP,Zipx,7z和CBZ文件。如果需要,也可以通过电子邮件发送Zip和Zipx文件。该应用程序允许查看图像,Web文件和文本随附的zip文件。其他功能包括打开加密文件,在手机上导航和管理文件,改进MP3无损压缩,云集成等。

    f4ac082e7565210acd132fb1c4947d59.png

    4. 7Zipper

    这是另一个功能强大的针对Android设备的存档管理应用程序,可帮助存档zip,七个zip和jar文件。使用该应用程序,可以提取许多档案,包括zip,egg,tar,rar,jar,lzh等。有复制,移动和粘贴文件及文件夹的功能。其他功能包括多选选项,sdcard使用,备份应用程序,系统信息,ftp客户端,ftp服务器,图像大小调整等。

    0bad2c2da5076e7c958a205768510e6e.png

    第3部分.适用于Android的3款图像压缩器

    1. Image Compressor

    Image Compressor由DLM Infosoft开发,是最受好评的应用程序之一,可帮助在设备上压缩图像。可以通过指定文件的百分比和尺寸来压缩添加的图像。还有一个选项可以预览带有压缩细节的图像。压缩文件可以使用该应用共享和删除。该应用程序的界面非常简单易懂,从而使该过程更快。

    cdd55024031c5265e1d0309f370c4a7e.png

    2. Photoczip

    使用此Android应用程序,您可以在一个简单的快速步骤中将所有图像文件压缩,调整大小并压缩到我们的设备中。该应用程序带有自定义的相机小部件,可帮助您实现一键压缩功能。可以使用该应用程序编辑JPG图像的元数据。其他功能包括在图库视图中预览压缩的图像,压缩和缩小不同大小的图像,共享照片,即时添加图像,将PNG转换为JPG,将所有图像压缩在一起,批量压缩等。

    859fb2d912d48363b049651ab9865ef0.png

    3. Image Compress

    Techinventions的Image Compress是一款简单有效的应用程序,用于在Android设备上压缩图像。该应用程序有助于按给定的大小和质量压缩和调整图像大小。可以根据需要设置用于压缩图像的目标大小。图像也可以以所需的宽度和高度以任意比例裁剪。简单的界面,快速的处理和良好的输出质量使该应用成为同类产品中最受好评的应用之一。

    a49144a757f83206efa2fe3a1ac3d209.png

    第4部分.2款推荐的Android视频压缩器

    1. Resize Video

    这是由Code Edifice开发的,这是Google Play商店中最受欢迎的视频压缩应用程序之一。该应用程序有助于修剪视频,将其调整为所需的大小,例如2x,3x,1 / 2x等。如果需要,还可以将音乐添加到视频文件中。该应用程序还通过删除音频部分来帮助创建静音视频。修剪和压缩后的视频可以在Facebook,Gmail等其他社交媒体网络上共享。

    ba5322997789d7902a1d83223bad175a.png

    2. Video Compressor

    Android Pixels的Video Compressor在Google Play商店中获得3.6的评分,是一款功能强大的应用。该应用程序允许压缩所需的视频而不会降低质量。视频还可以针对特定设备(例如iPhone,iPad和Android)以及网站进行压缩。该应用程序支持多种格式,包括MP4,AVI,3GP等。可以在一系列社交媒体平台(如Facebook,WhatsApp,Gmail等)上共享已处理的视频。其他功能包括预览功能,将压缩视频保存到SD卡等。

    f10924bd366c50459e3e1bc18899c7b5.png

    第5部分.您应该知道的Android音频压缩器

    1. MP3 Compressor

    使用Google Play商店上的此应用,以快速,简单的方式获取所有类型的音频文件。该应用程序支持几乎所有类型的音频格式,并以高质量促进文件转换。使用该应用程序,可以根据需要创建压缩铃声,还可以选择创建融合歌曲。这个轻巧的应用程序带有一个简单的界面,可以预览铃声并编辑所需的音频文件。

    a542100294ad4fd4a8744bdeac6fceed.png

    2. Mp3 Compressor

    这是由SunStar Photo Video Apps Studio开发的,易于使用的应用程序,可帮助压缩不同大小的MP3,AC3,FLAC,WAV,WMA和其他音频格式。压缩文件可以与亲爱的人通过社交媒体共享。还有一个选项可以将压缩的音频文件保存到SD卡。这个用于压缩音频文件android的应用程序是免费使用且轻巧的。

    62512719126489741d80e0a6069891bd.png
    展开全文
  • Android端zip压缩与解压,目前暂时只做zip格式支持,基于Zip4j 进行扩展成工具类,支持对单个文件,多个文件以及文件夹进行压缩,对压缩文件解压到到指定目录,支持压缩解压使用密码。
  • Zip文件结构ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体。文件实体由一个头部和文件数据组,Central Directory由多个File header组成,每个File header都保存一个文件实体的...

    Zip文件结构

    ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体。

    文件实体由一个头部和文件数据组,Central Directory由多个File header组成,每个File header都保存一个文件实体的偏移,文件最后由End of central directory结束。

    945514fad817b201bb16be8ee9cecbd2.png

    用到的类

    ZipFile

    此类用于从 ZIP 文件读取条目ZipEntry,在解压时用到

    ZipEntry

    此类用于表示 ZIP 文件条目

    ZipOutputStream

    此类为以 ZIP 文件格式写入文件实现输出流过滤器

    Enumeration

    实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素,在解压缩时会用到

    CheckedOutputStream

    需要维护写入数据校验和的输出流。校验和可用于验证输出数据的完整性。

    CRC32

    可用于计算数据流的 CRC-32 的类

    压缩流程

    首先要封装出一个ZipOutputStream: 1fd1975d502af87bd5ffd99b56747145.png

    ZipOutputStream zipOutputStream = new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(file),new CRC32()));

    有了ZipOutputStream后,要压缩一个文件,就先在输出流加入一个ZipEntry,然后获取需要压缩的文件输入流,然后再输出:

    06437344939e59a767684c636295de7a.png

    注意最后要刷新和关闭输出流

    zipOutputStream.flush();
    zipOutputStream.close();

    当然这只是单个文件的压缩,我们压缩文件时经常会压缩整个文件夹,所以还需要遍历整个文档,针对目录和文件分别作出判断:

    e2808ca09d73318df4fedae7a0e52902.png

    if (fileSrc.isDirectory()) {
    File[] files = fileSrc.listFiles();
    name = name+"/";
    zipOutputStream.putNextEntry(new ZipEntry(name)); // 建一个文件夹
    System.out.println("目录名: "+name);
    for (File f : files) {
    zip(zipOutputStream,name+f.getName(),f);
    System.out.println("目录: "+name+f.getName());
    }
    }

    解压缩流程

    解压缩就是压缩的逆过程,其过程就是从压缩文件中获取ZipEntry,获取其输入流,将其输出到指定位置:

    5a5d07735bca6700d71b3b479d0d7fc6.png

    这也是单个文件的解压缩,解压缩文件夹只需遍历ZipFile,判断ZipEntry是目录还是文件,具体操作不再详解,可到文末的源码中查看。

    源码: 点击 阅读原文 查看

    展开全文
  • 我在做一项目中,工程文件中有一功能需要很图片,图片与app一起打包下来的话有30+M,那么我们就考虑另外下载压缩包,我们将图片取出,工程就只有4+M了,哈哈哈哈,呵呵,真恐怖。那么这样就涉及到另外下载...

    我在做一个项目中,工程文件中有一个功能需要很多图片,图片与app一起打包下来的话有30+M,那么我们就考虑另外下载压缩包,我们将图片取出,工程就只有4+M了,哈哈哈哈,呵呵,真恐怖。那么这样就涉及到另外下载压缩包,以及压缩包的解压。

    java的工具类里面也包含的有对zip的处理。

    代码实现                                                                                      

    复制代码
    public class Util {
        public static final String ZIP_FILENAME = "/data/data/com.yydcdut.unzip/new_ios_7_icons_by_sunkotora-d68qbmo.zip";//需要解压缩的文件名  
        public static final String ZIP_DIR = "/data/data/com.yydcdut.unzip/";//需要压缩的文件夹  
        public static final String UN_ZIP_DIR = "/data/data/com.yydcdut.unzip/zzip/";//要解压的文件目录  
        //上面两个变量好像说反了。
        public static final int BUFFER = 1024 ;//缓存大小  
    
        /** 
         * zip压缩功能. 
         * 压缩baseDir(文件夹目录)下所有文件,包括子目录 
         * @throws Exception 
         */  
        public static void zipFile(String baseDir,String fileName) throws Exception{  
            List fileList=getSubFiles(new File(baseDir));  
            ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));  
            ZipEntry ze=null;  
            byte[] buf=new byte[BUFFER];  
            int readLen=0;  
            for(int i = 0; i <fileList.size(); i++) {  
                File f=(File)fileList.get(i);  
                ze=new ZipEntry(getAbsFileName(baseDir, f));  
                ze.setSize(f.length());  
                ze.setTime(f.lastModified());     
                zos.putNextEntry(ze);  
                InputStream is=new BufferedInputStream(new FileInputStream(f));  
                while ((readLen=is.read(buf, 0, BUFFER))!=-1) {  
                    zos.write(buf, 0, readLen);  
                }  
                is.close();  
            }  
            zos.close();  
        }  
    
        /** 
         * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径. 
         * @param baseDir java.lang.String 根目录 
         * @param realFileName java.io.File 实际的文件名 
         * @return 相对文件名 
         */  
        private static String getAbsFileName(String baseDir, File realFileName){  
            File real=realFileName;  
            File base=new File(baseDir);  
            String ret=real.getName();  
            while (true) {  
                real=real.getParentFile();  
                if(real==null)   
                    break;  
                if(real.equals(base))   
                    break;  
                else  
                    ret=real.getName()+"/"+ret;  
            }  
            return ret;  
        }  
    
        /** 
         * 取得指定目录下的所有文件列表,包括子目录. 
         * @param baseDir File 指定的目录 
         * @return 包含java.io.File的List 
         */  
        private static List getSubFiles(File baseDir){  
            List ret=new ArrayList();  
            File[] tmp=baseDir.listFiles();  
            for (int i = 0; i <tmp.length; i++) {  
                if(tmp[i].isFile())  
                    ret.add(tmp[i]);  
                if(tmp[i].isDirectory())  
                    ret.addAll(getSubFiles(tmp[i]));  
            }  
            return ret;  
        }  
    
        /** 
         * 解压缩功能. 
         * 将ZIP_FILENAME文件解压到ZIP_DIR目录下. 
         * @throws Exception 
         */  
        public static void upZipFile() throws Exception{  
            ZipFile zfile=new ZipFile(ZIP_FILENAME);  
            Enumeration zList=zfile.entries();  
            ZipEntry ze=null;  
            byte[] buf=new byte[1024];  
            while(zList.hasMoreElements()){  
                ze=(ZipEntry)zList.nextElement();         
                if(ze.isDirectory()){  
                    File f=new File(ZIP_DIR+ze.getName());  
                    f.mkdir();  
                    continue;  
                }  
                OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));  
                InputStream is=new BufferedInputStream(zfile.getInputStream(ze));  
                int readLen=0;  
                while ((readLen=is.read(buf, 0, 1024))!=-1) {  
                    os.write(buf, 0, readLen);  
                }  
                is.close();  
                os.close();   
            }  
            zfile.close();  
        }  
    
        /** 
         * 给定根目录,返回一个相对路径所对应的实际文件名. 
         * @param baseDir 指定根目录 
         * @param absFileName 相对路径名,来自于ZipEntry中的name 
         * @return java.io.File 实际的文件 
         */  
        public static File getRealFileName(String baseDir, String absFileName){  
            String[] dirs=absFileName.split("/");  
            File ret=new File(baseDir);  
            if(dirs.length>1){  
                for (int i = 0; i < dirs.length-1;i++) {  
                    ret=new File(ret, dirs[i]);  
                }  
                if(!ret.exists())  
                    ret.mkdirs();  
                ret=new File(ret, dirs[dirs.length-1]);  
                return ret;  
            }  
            return ret;  
        }  
    }
    复制代码

    代码分析                                                                                    

    先说解压,用ZipFile实例化压缩文件,接下来对ZipFile进行处理。列举出ZipFile中的元素,在用IO操作将ZipFile中的元素转化成文件,如果是目录,则创建目录继续操作。

    压缩,运用ZipOutputStream将文件转成IO输出流,再BufferedInputStream输入流写入进去。

    我是天王盖地虎的分割线                                                                

    源代码:http://pan.baidu.com/s/1dD1Qx01

    unzip.zip

     




    本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3813870.html,如需转载请自行联系原作者

    展开全文
  • 如果需要下载的文件有很是中文名的,解压时有中文名的文件出现乱码,试了很方法不能解决问题。据说有一个Java插件包,用这个插件包可以.../*** 解压缩个文件** @param zipFile* 压缩文件* @param folderPath* ...

    如果需要下载的文件有很多是中文名的,解压时有中文名的文件出现乱码,试了很多方法不能解决问题。据说有一个Java插件包,用这个插件包可以解决中文名乱码的问题,但不知解压的文件是否要用它提供的类压缩后的文件,是否能解决用rar工具压缩的有中文名的文件,这个还没有试过。

    /**

    * 解压缩一个文件

    *

    * @param zipFile

    * 压缩文件

    * @param folderPath

    * 解压缩的目标目录

    * @throws IOException

    * 当解压缩过程出错时抛出

    */

    public static void upZipFile(File zipFile, String folderPath)

    throws ZipException, IOException {

    File desDir = new File(folderPath);

    if (!desDir.exists()) {

    desDir.mkdirs();

    }

    ZipFile zf = new ZipFile(zipFile);

    for (Enumeration> entries = zf.entries(); entries.hasMoreElements();) {

    ZipEntry entry = ((ZipEntry) entries.nextElement());

    InputStream in = zf.getInputStream(entry);

    String str = folderPath;

    // str = new String(str.getBytes("8859_1"), "GB2312");

    File desFile = new File(str, java.net.URLEncoder.encode(

    entry.getName(), "UTF-8"));

    if (!desFile.exists()) {

    File fileParentDir = desFile.getParentFile();

    if (!fileParentDir.exists()) {

    fileParentDir.mkdirs();

    }

    }

    OutputStream out = new FileOutputStream(desFile);

    byte buffer[] = new byte[1024 * 1024];

    int realLength = in.read(buffer);

    while (realLength != -1) {

    out.write(buffer, 0, realLength);

    realLength = in.read(buffer);

    }

    out.close();

    in.close();

    }

    }

    /**

    * 解压缩一个文件

    *

    */

    public static void Unzip(String zipFile, String targetDir) {

    int BUFFER = 4096; // 这里缓冲区我们使用4KB,

    String strEntry; // 保存每个zip的条目名称

    try {

    BufferedOutputStream dest = null; // 缓冲输出流

    FileInputStream fis = new FileInputStream(zipFile);

    ZipInputStream zis = new ZipInputStream(

    new BufferedInputStream(fis));

    ZipEntry entry; // 每个zip条目的实例

    while ((entry = zis.getNextEntry()) != null) {

    try {

    int count;

    byte data[] = new byte[BUFFER];

    strEntry = entry.getName();

    File entryFile = new File(targetDir + strEntry);

    File entryDir = new File(entryFile.getParent());

    if (!entryDir.exists()) {

    entryDir.mkdirs();

    }

    FileOutputStream fos = new FileOutputStream(entryFile);

    dest = new BufferedOutputStream(fos, BUFFER);

    while ((count = zis.read(data, 0, BUFFER)) != -1) {

    dest.write(data, 0, count);

    }

    dest.flush();

    dest.close();

    } catch (Exception ex) {

    ex.printStackTrace();

    }

    }

    zis.close();

    } catch (Exception cwj) {

    cwj.printStackTrace();

    }

    }

    zip扮演着归档和压缩两个角色;gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩。Java I/O类库还收录了一些能读写压缩格式流的类。要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了。这些类不是Reader和Writer,而是InputStream和OutStreamput的子类。这是因为压缩算法是针对byte而不是字符的。

    相关类与接口:Checksum 接口:被类Adler32和CRC32实现的接口Adler32 :使用Alder32算法来计算Checksum数目CRC32 :使用CRC32算法来计算Checksum数目CheckedInputStream :InputStream派生类,可得到输入流的校验和Checksum,用于校验数据的完整性CheckedOutputStream :OutputStream派生类,可得到输出流的校验和Checksum, 用于校验数据的完整性DeflaterOutputStream :压缩类的基类。ZipOutputStream :DeflaterOutputStream的一个子类,把数据压缩成Zip文件格式。GZIPOutputStream :DeflaterOutputStream的一个子类,把数据压缩成GZip文件格式InflaterInputStream :解压缩类的基类ZipInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据GZIPInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据ZipEntry 类:表示 ZIP 文件条目ZipFile 类:此类用于从 ZIP 文件读取条目

    用GZIP进行对单个文件压缩

    GZIP的接口比较简单,因此如果你只需对一个流进行压缩的话,可以使用它。当然它可以压缩字符流,与可以压缩字节流,下面是一个对GBK编码格式的文本文件进行压缩的。

    压缩类的用法非常简单;只要用GZIPOutputStream 或ZipOutputStream把输出流包起来,再用GZIPInputStream 或ZipInputStream把输入流包起来就行了。剩下的都是些普通的I/O操作。Java代码

    import java.io.BufferedOutputStream;

    import java.io.BufferedReader;

    import java.io.FileInputStream;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.InputStreamReader;

    import java.util.zip.GZIPInputStream;

    import java.util.zip.GZIPOutputStream;

    public class GZIPcompress {

    public static void main(String[] args) throws IOException {

    //做准备压缩一个字符文件,注,这里的字符文件要是GBK编码方式的

    BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("e:/tmp/source.txt"), "GBK"));

    //使用GZIPOutputStream包装OutputStream流,使其具体压缩特性,最后会生成test.txt.gz压缩包

    //并且里面有一个名为test.txt的文件

    BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("test.txt.gz")));

    System.out.println("开始写压缩文件...");

    int c;

    while ((c = in.read()) != -1) {

    /*

    * 注,这里是压缩一个字符文件,前面是以字符流来读的,不能直接存入c,因为c已是Unicode

    * 码,这样会丢掉信息的(当然本身编码格式就不对),所以这里要以GBK来解后再存入。

    */

    out.write(String.valueOf((char) c).getBytes("GBK"));

    }

    in.close();

    out.close();

    System.out.println("开始读压缩文件...");

    //使用GZIPInputStream包装InputStream流,使其具有解压特性

    BufferedReader in2 = new BufferedReader(new InputStreamReader(

    new GZIPInputStream(new FileInputStream("test.txt.gz")), "GBK"));

    String s;

    //读取压缩文件里的内容

    while ((s = in2.readLine()) != null) {

    System.out.println(s);

    }

    in2.close();

    }

    }

    使用Zip进行多个文件压缩

    Java对Zip格式类库支持得比较全面,得用它可以把多个文件压缩成一个压缩包。这个类库使用的是标准Zip格式,所以能与很多的压缩工具兼容。

    ZipOutputStream类有设置压缩方法以及在压缩方式下使用的压缩级别,zipOutputStream.setMethod(int method)设置用于条目的默认压缩方法。只要没有为单个 ZIP 文件条目指定压缩方法,就使用ZipOutputStream所设置的压缩方法来存储,默认值为 ZipOutputStream.DEFLATED(表示进行压缩存储),还可以设置成STORED(表示仅打包归档存储)。   ZipOutputStream在设置了压缩方法为DEFLATED后,我们还可以进一步使用setLevel(int level)方法来设置压缩级别,压缩级别值为0-9共10个级别(值越大,表示压缩越利害),默认为 Deflater.DEFAULT_COMPRESSION=-1。当然我们也可以通过条目ZipEntry的setMethod方法为单个条件设置压缩方法。

    类ZipEntry描述了存储在ZIP文件中的压缩文件。类中包含有多种方法可以用来设置和获得ZIP条目的信息。类ZipEntry是被  ZipFile[zipFile.getInputStream(ZipEntry entry)]和ZipInputStream使用来读取ZIP文件,ZipOutputStream来写入ZIP文件的。有以下这些有用的方法:getName()返回条目名称、isDirectory()如果为目录条目,则返回 true(目录条目定义为其名称以 '/' 结尾的条目)、setMethod(int method) 设置条目的压缩方法,可以为 ZipOutputStream.STORED 或 ZipOutputStream .DEFLATED。

    下面实例我们使用了apache的zip工具包(所在包为ant.jar ),因为java类型自带的不支持中文路径,不过两者使用的方式是一样的,只是apache压缩工具多了设置编码方式的接口,其他基本上是一样的。另外,如果使用org.apache.tools.zip.ZipOutputStream来压缩的话,我们只能使用 org.apache.tools.zip.ZipEntry来解压,而不能使用java.util.zip.ZipInputStream来解压读取了,当然apache并未提供ZipInputStream类。

    转载代码:

    import java.io.BufferedInputStream;

    import java.io.BufferedOutputStream;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.util.Enumeration;

    import java.util.zip.CRC32;

    import java.util.zip.CheckedInputStream;

    import java.util.zip.CheckedOutputStream;

    import java.util.zip.Deflater;

    import java.util.zip.ZipException;

    import java.util.zip.ZipInputStream;

    import org.apache.tools.zip.ZipEntry;

    import org.apache.tools.zip.ZipFile;

    import org.apache.tools.zip.ZipOutputStream;

    /**

    *

    * 提供对单个文件与目录的压缩,并支持是否需要创建压缩源目录、中文路径

    *

    * @author jzj

    */

    public class ZipCompress {

    private static boolean isCreateSrcDir = true;//是否创建源目录

    /**

    * @param args

    * @throws IOException

    */

    public static void main(String[] args) throws IOException {

    String src = "m:/新建文本文档.txt";//指定压缩源,可以是目录或文件

    String decompressDir = "e:/tmp/decompress";//解压路径

    String archive = "e:/tmp/test.zip";//压缩包路径

    String comment = "Java Zip 测试.";//压缩包注释

    //----压缩文件或目录

    writeByApacheZipOutputStream(src, archive, comment);

    /*

    * 读压缩文件,注释掉,因为使用的是apache的压缩类,所以使用java类库中

    * 解压类时出错,这里不能运行

    */

    //readByZipInputStream();

    //----使用apace ZipFile读取压缩文件

    readByApacheZipFile(archive, decompressDir);

    }

    public static void writeByApacheZipOutputStream(String src, String archive, String comment) throws FileNotFoundException, IOException {

    //----压缩文件:

    FileOutputStream f = new FileOutputStream(archive);

    //使用指定校验和创建输出流

    CheckedOutputStream csum = new CheckedOutputStream(f, new CRC32());

    ZipOutputStream zos = new ZipOutputStream(csum);

    //支持中文

    zos.setEncoding("GBK");

    BufferedOutputStream out = new BufferedOutputStream(zos);

    //设置压缩包注释

    zos.setComment(comment);

    //启用压缩

    zos.setMethod(ZipOutputStream.DEFLATED);

    //压缩级别为最强压缩,但时间要花得多一点

    zos.setLevel(Deflater.BEST_COMPRESSION);

    File srcFile = new File(src);

    if (!srcFile.exists() || (srcFile.isDirectory() && srcFile.list().length == 0)) {

    throw new FileNotFoundException("File must exist and ZIP file must have at least one entry.");

    }

    //获取压缩源所在父目录

    src = src.replaceAll("\\", "/");

    String prefixDir = null;

    if (srcFile.isFile()) {

    prefixDir = src.substring(0, src.lastIndexOf("/") + 1);

    } else {

    prefixDir = (src.replaceAll("/$", "") + "/");

    }

    //如果不是根目录

    if (prefixDir.indexOf("/") != (prefixDir.length() - 1) && isCreateSrcDir) {

    prefixDir = prefixDir.replaceAll("[^/]+/$", "");

    }

    //开始压缩

    writeRecursive(zos, out, srcFile, prefixDir);

    out.close();

    // 注:校验和要在流关闭后才准备,一定要放在流被关闭后使用

    System.out.println("Checksum: " + csum.getChecksum().getValue());

    BufferedInputStream bi;

    }

    转载代码:

    /**

    * 使用 org.apache.tools.zip.ZipFile 解压文件,它与 java 类库中的

    * java.util.zip.ZipFile 使用方式是一新的,只不过多了设置编码方式的

    * 接口。

    *

    * 注,apache 没有提供 ZipInputStream 类,所以只能使用它提供的ZipFile

    * 来读取压缩文件。

    * @param archive 压缩包路径

    * @param decompressDir 解压路径

    * @throws IOException

    * @throws FileNotFoundException

    * @throws ZipException

    */

    public static void readByApacheZipFile(String archive, String decompressDir) throws IOException, FileNotFoundException, ZipException {

    BufferedInputStream bi;

    ZipFile zf = new ZipFile(archive, "GBK");//支持中文

    Enumeration e = zf.getEntries();

    while (e.hasMoreElements()) {

    ZipEntry ze2 = (ZipEntry) e.nextElement();

    String entryName = ze2.getName();

    String path = decompressDir + "/" + entryName;

    if (ze2.isDirectory()) {

    System.out.println("正在创建解压目录 - " + entryName);

    File decompressDirFile = new File(path);

    if (!decompressDirFile.exists()) {

    decompressDirFile.mkdirs();

    }

    } else {

    System.out.println("正在创建解压文件 - " + entryName);

    String fileDir = path.substring(0, path.lastIndexOf("/"));

    File fileDirFile = new File(fileDir);

    if (!fileDirFile.exists()) {

    fileDirFile.mkdirs();

    }

    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(decompressDir + "/" + entryName));

    bi = new BufferedInputStream(zf.getInputStream(ze2));

    byte[] readContent = new byte[1024];

    int readCount = bi.read(readContent);

    while (readCount != -1) {

    bos.write(readContent, 0, readCount);

    readCount = bi.read(readContent);

    }

    bos.close();

    }

    }

    zf.close();

    }

    /**

    * 使用 java api 中的 ZipInputStream 类解压文件,但如果压缩时采用了

    * org.apache.tools.zip.ZipOutputStream时,而不是 java 类库中的

    * java.util.zip.ZipOutputStream时,该方法不能使用,原因就是编码方

    * 式不一致导致,运行时会抛如下异常:

    * java.lang.IllegalArgumentException

    * at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:290)

    *

    * 当然,如果压缩包使用的是java类库的java.util.zip.ZipOutputStream

    * 压缩而成是不会有问题的,但它不支持中文

    *

    * @param archive 压缩包路径

    * @param decompressDir 解压路径

    * @throws FileNotFoundException

    * @throws IOException

    */

    public static void readByZipInputStream(String archive, String decompressDir) throws FileNotFoundException, IOException {

    BufferedInputStream bi;

    //----解压文件(ZIP文件的解压缩实质上就是从输入流中读取数据):

    System.out.println("开始读压缩文件");

    FileInputStream fi = new FileInputStream(archive);

    CheckedInputStream csumi = new CheckedInputStream(fi, new CRC32());

    ZipInputStream in2 = new ZipInputStream(csumi);

    bi = new BufferedInputStream(in2);

    java.util.zip.ZipEntry ze;//压缩文件条目

    //遍历压缩包中的文件条目

    while ((ze = in2.getNextEntry()) != null) {

    String entryName = ze.getName();

    if (ze.isDirectory()) {

    System.out.println("正在创建解压目录 - " + entryName);

    File decompressDirFile = new File(decompressDir + "/" + entryName);

    if (!decompressDirFile.exists()) {

    decompressDirFile.mkdirs();

    }

    } else {

    System.out.println("正在创建解压文件 - " + entryName);

    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(decompressDir + "/" + entryName));

    byte[] buffer = new byte[1024];

    int readCount = bi.read(buffer);

    while (readCount != -1) {

    bos.write(buffer, 0, readCount);

    readCount = bi.read(buffer);

    }

    bos.close();

    }

    }

    bi.close();

    System.out.println("Checksum: " + csumi.getChecksum().getValue());

    }

    /**

    * 递归压缩

    *

    * 使用 org.apache.tools.zip.ZipOutputStream 类进行压缩,它的好处就是支持中文路径,

    * 而Java类库中的 java.util.zip.ZipOutputStream 压缩中文文件名时压缩包会出现乱码。

    * 使用 apache 中的这个类与 java 类库中的用法是一新的,只是能设置编码方式了。

    *

    * @param zos

    * @param bo

    * @param srcFile

    * @param prefixDir

    * @throws IOException

    * @throws FileNotFoundException

    */

    private static void writeRecursive(ZipOutputStream zos,BufferedOutputStream bo,File srcFile, String prefixDir) throws IOException, FileNotFoundException {

    ZipEntry zipEntry;

    String filePath = srcFile.getAbsolutePath().replaceAll("\\", "/").replaceAll("//", "/");

    if (srcFile.isDirectory()) {

    filePath = filePath.replaceAll("/$", "") + "/";

    }

    String entryName = filePath.replace(prefixDir, "").replaceAll("/$", "");

    if (srcFile.isDirectory()) {

    if (!"".equals(entryName)) {

    System.out.println("正在创建目录 - " + srcFile.getAbsolutePath() + " entry/");

    zos.putNextEntry(zipEntry);

    }

    File srcFiles[] = srcFile.listFiles();

    for (int i = 0; i < srcFiles.length; i++) {

    writeRecursive(zos, bo, srcFiles[i], prefixDir);

    }

    } else {

    System.out.println("正在写文件 - " + srcFile.getAbsolutePath() + " entrym:/新建文本文档.txt";//指定压缩源,可以是目录或文件

    String decompressDir = "e:/tmp/decompress";//解压路径

    String archive = "e:/tmp/test.zip";//压缩包路径

    String comment = "Java Zip 测试.";//压缩包注释

    //----压缩文件或目录

    writeByApacheZipOutputStream(src, archive, comment);

    /*

    * 读压缩文件,注释掉,因为使用的是apache的压缩类,所以使用java类库中

    * 解压类时出错,这里不能运行

    */

    //readByZipInputStream();

    //----使用apace ZipFile读取压缩文件

    readByApacheZipFile(archive, decompressDir);

    }

    public static void writeByApacheZipOutputStream(String src, String archive, String comment) throws FileNotFoundException, IOException {

    //----压缩文件:

    FileOutputStream f = new FileOutputStream(archive);

    //使用指定校验和创建输出流

    CheckedOutputStream csum = new CheckedOutputStream(f, new CRC32());

    ZipOutputStream zos = new ZipOutputStream(csum);

    //支持中文

    zos.setEncoding("GBK");

    BufferedOutputStream out = new BufferedOutputStream(zos);

    //设置压缩包注释

    zos.setComment(comment);

    //启用压缩

    zos.setMethod(ZipOutputStream.DEFLATED);

    //压缩级别为最强压缩,但时间要花得多一点

    zos.setLevel(Deflater.BEST_COMPRESSION);

    File srcFile = new File(src);

    if (!srcFile.exists() || (srcFile.isDirectory() && srcFile.list().length == 0)) {

    throw new FileNotFoundException("File must exist and ZIP file must have at least one entry.");

    }

    //获取压缩源所在父目录

    src = src.replaceAll("\\", "/");

    String prefixDir = null;

    if (srcFile.isFile()) {

    prefixDir = src.substring(0, src.lastIndexOf("/") + 1);

    } else {

    prefixDir = (src.replaceAll("/$", "") + "/");

    }

    //如果不是根目录

    if (prefixDir.indexOf("/") != (prefixDir.length() - 1) && isCreateSrcDir) {

    prefixDir = prefixDir.replaceAll("[^/]+/$", "");

    }

    //开始压缩

    writeRecursive(zos, out, srcFile, prefixDir);

    out.close();

    // 注:校验和要在流关闭后才准备,一定要放在流被关闭后使用

    System.out.println("Checksum: " + csum.getChecksum().getValue());

    BufferedInputStream bi;

    }

    要想把文件加入压缩包,你必须将ZipEntry对象传给putNextEntry( )。ZipEntry是一个接口很复杂的对象,它能让你设置和读取Zip文件里的某条记录的信息,这些信息包括:文件名,压缩前和压缩后的大小,日期,CRC校验码,附加字段,注释,压缩方法,是否是目录。虽然标准的Zip格式是支持口令的,但是Java的Zip类库却不支持。而且ZipEntry  却只提供了CRC的接口,而CheckedInputStream和CheckedOutputStream却支持Adler32和CRC32两种校验码。虽然这是底层的Zip格式的限制,但却妨碍了你使用更快的Adler32了。

    要想提取文件,可以用ZipInputStream的getNextEntry( )方法。只要压缩包里还有ZipEntry,它就会把它提取出来。此外还有一个更简洁的办法,你可以用ZipFile对象去读文件。ZipFile有一个 entries()方法,它可以返回ZipEntries的Enumeration。然后通过zipFile. getInputStream(ZipEntry entry)获取压缩流就可以读取相应条目了。   要想读取校验码,必须先获取Checksum对象。我们这里用的是CheckedOutputStream和 CheckedInputStream,不过你也可以使用Checksum。java.util.zip包中比较重要校验算法类是Adler32和 CRC32,它们实现了java.util.zip.Checksum接口,并估算了压缩数据的校验和(checksum)。在运算速度方面,Adler32算法比CRC32算法要有一定的优势;但在数据可信度方面,CRC32算法则要更胜一筹。GetValue方法可以用来获得当前的  checksum值,reset方法能够重新设置checksum为其缺省的值。   校验和一般用来校验文件和信息是否正确的传送。举个例子,假设你想创建一个ZIP文件,然后将其传送到远程计算机上。当到达远程计算机后,你就可以使用checksum检验在传输过程中文件是否发生错误,有点像下载文件后我们可以使用哈希值来校验文件下载过程是否出错了。   Zip类里还有一个让人莫名其妙的setComment( )方法。如ZipCompress.java所示,写文件的时候,你可以加注释,但是读文件的时候,ZipInputSream却不提供接口。看来它的注释功能完全是针对条目的,是用ZipEntry实现的。   当然,GZIP和Zip不光能用来压缩文件——它还能压缩任何东西,包括要通过网络传输的数据。

    展开全文
  • Zip文件结构ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体。文件实体由一个头部和文件数据组,Central Directory由多个File header组成,每个File header都保存一个文件实体的...
  • 前言 一个多月前,因项目需要对Java语言下的zip格式压缩文件的处理作了一些了解,尝试了多种开源项目并写了几篇博客做记录: ...
  • 将demo里面的图片资源文件放进去,他会自动生成新的压缩图片 下载后替换原来的图片就行了 注意 有些图片压缩后,可能效果不是很好,特别是大的图片,最好检查一下 一般 情况还是可以的
  • Android/Java 压缩/解压/加密文件/zip

    千次阅读 2018-11-06 19:05:44
     常我们再开发过程中,无论是Android 客户端程序还是桌面程序,有可能涉及到文件的上传和下载,多文件时通常做zip压缩处理,将多个文件压缩为一个zip包,方便传输,另外,客户端内也可能会涉及到一些资源的下载,...
  • 导致拍下来的图片文件过大,在上传服务器的时候比较慢,或者很大导致无法上传,我们就用到了Bitmap压缩图片,也没什么效果图,废话不说,直接贴代码,其实很简单,我封装好的一工具类,你们直接调用里面的方法就可以....
  • Zip文件结构ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体。文件实体由一个头部和文件数据组,Central Directory由多个File header组成,每个File header都保存一个文件实体的...
  • Android中用Java代码实现zip文件压缩

    千次阅读 2015-04-30 16:58:15
    据说有一Java插件包,用这插件包可以解决中文名乱码的问题,但不知解压的文件是否要用它提供的类压缩后的文件,是否能解决用rar工具压缩的有中文名的文件,这还没有试过。 参考资料:@1....
  • Android视频压缩

    千次阅读 2018-01-16 10:26:29
    开发中视频压缩大多数使用的FFMPEG技术,很大神都有详细介绍他的NDK编译so库文件的文章,其实有时候就是一简单的视频压缩引入so库后导致apk大了几十兆,难以接受,后发现有大神已经压缩好的aar文件可以直接引入...
  • pigz线程压缩文件

    万次阅读 2016-09-13 11:35:20
    pigz是linux下线程压缩软件,发音: “pig-zee”。 使用方法: tar cf - mydir | pigz >mydir.tgz 如果文件少可以: tar cvf - mydir | pigz >mydir.tgz ...我在28核56线程的机器上,压缩个android项目,单
  • 问题困扰了很久 一项目代码量没多少 但是编译的APK文件却很大,有甚者超过了100M 除却很图片资源 我还是一步一步的尝试了下各种方法 果然 一120M的APK缩减到了70M 那我们就一步一步分析下 我们的一完整...
  • Glide 是一个android平台上的快速和高效的开源的多媒体资源管理库, 提供 多媒体文件压缩,内存和磁盘缓存, 资源池的接口 Glide 支持获取,解压展示视频, 图像和GIFs, Glide有一可弹性的api可以让开发者自定义...
  • 我会把类似于像视频转换,pdf压缩啊,统统的在这里做一收集,感兴趣的可以收藏和关注我,背景:大概我写《android开发专栏》系列文章的时候,会遇到需要展示一demo给大家观赏的需求,从17年到现在,我用过太太...
  • android ZLib压缩/解压缩

    千次阅读 2016-09-28 20:07:28
    项目里面有一接口要频繁的刷新数据,同时数据量有很大,为了优化传输速度和节省流量,决定使用传输二进制数据,并将数据进行ZLib压缩。这就需要APP端进行二进制数据的解析和对数据进行ZLib解压缩. 不说了,具体...
  • 随着google如火如荼的推出android studio IDE和gradle buld工具,很公司要对build系统做从ant到gradle的升级,不幸的是我被分配负责该任务。 发现一问题,gralde编译后的apk比ant要大大约1M左右,对于老大...
  • Android端zip压缩与解压,目前暂时只做zip格式支持,基于Zip4j (http://www.lingala.net/zip4j/)进行扩展成工具类,支持对单个文件,多个文件以及文件夹进行压缩,对压缩文件解压到到指定目录,支持压缩解压使用密码...
  • 多个文件上传常常需要将一个文件夹中的文件先压缩成一个zip文件,之后再次上传到服务器上。 经过Google一番,最终发现一个比较简单的解压缩工具类。 使用: public static void compressDB(Context context){ ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 504
精华内容 201
热门标签
关键字:

android压缩多个文件