Android应用中如何对文件进行压缩与解压缩

  

Android应用中如何对文件进行压缩与解压缩?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强>使用场景

当我们在应用的资产目录中需要加入文件时,可以直接将源文件放入,但这样会造成打包后的apk整体过大,此时就需要将放入的文件进行压缩。又如当我们需要从服务器中下载文件时,如果下载源文件耗时又消耗流量,较大文件需要压缩,可以使得传输效率大大提高。下面我们就学习下基本的文件压缩和解压缩。Java中提供了压缩和解压缩的输入输出流

public  static  void  zip (String  src, String 桌子),throwsIOException  {//才能定义压缩输出流   时间=ZipOutputStreamout 才能;零;   try {才能   ,,,//传入源文件   ,,,File 外部档案=,newFile中(桌子);   ,,,File  fileOrDirectory=, newFile中(src);   ,,,//传入压缩输出流   ,,,out =, newZipOutputStream (newFileOutputStream(输出文件);   ,,,//判断是否是一个文件或目录   ,,,//如果是文件则压缩   ,,,if  (fileOrDirectory.isFile ()) {   ,,,,,zipFileOrDirectory (fileOrDirectory,,““);   ,,,},{else    ,,,,,//否则列出目录中的所有文件递归进行压缩   ,,,,,文件[]entries =, fileOrDirectory.listFiles ();   ,,,,,for  (int  i=, 0;,小姐:& lt;, entries.length;我+ +),{   ,,,,,,,zipFileOrDirectory(条目,““);   ,,,,,}   ,,,}   }才能赶上(IOException 交货),{   ,,,ex.printStackTrace ();   最后}{才能   ,,,if  (!=, null) {   ,,,,,try  {   ,,,,,,,out.close ();   ,,,,,}捕捉(IOException 交货),{   ,,,,,,,ex.printStackTrace ();   ,,,,,}   ,,,}   ,,}   }   private  static  void  zipFileOrDirectory (ZipOutputStream ,, File  fileOrDirectory,, String  curPath) throwsIOException  {   时间=FileInputStreamin 才能;零;   try {才能   ,,,//判断目录是否为null   ,,,if  (! fileOrDirectory.isDirectory ()) {   ,,,,,byte[],缓冲=,new 字节[4096];   ,,,,,int  bytes_read;   ,,,,,,=,newFileInputStream (fileOrDirectory);   ,,,,,//归档压缩目录   ,,,,,ZipEntryentry =, newZipEntry(时间+ curPath  fileOrDirectory.getName ());   ,,,,,//将压缩目录写到输出流中   ,,,,,out.putNextEntry(入口);   ,,,,,while  ((bytes_read=, in.read(缓冲))!=,1),{   ,,,,,,,out.write(缓冲区,0,,bytes_read);   ,,,,,}   ,,,,,out.closeEntry ();   ,,,},{else    ,,,,,//列出目录中的所有文件   ,,,,,文件[]entries =, fileOrDirectory.listFiles ();   ,,,,,for  (int  i=, 0;,小姐:& lt;, entries.length;我+ +),{   ,,,,,,,//递归压缩   ,,,,,,,zipFileOrDirectory(条目,curPath  +, fileOrDirectory.getName () +,“/?;   ,,,,,}   ,,,}   }才能赶上(IOException 交货),{   ,,,ex.printStackTrace ();   最后}{才能   ,,,if (在!=,null) {   ,,,,,try  {   ,,,,,,,in.close ();   ,,,,,}捕捉(IOException 交货),{   ,,,,,,,ex.printStackTrace ();   ,,,,,}   ,,,}   ,,}   }

上述代码存在问题,若文件压缩后仍然很大怎么办,换句话说文件压缩率低也是问题,java中也专门对Linux提供了高压缩率的输入输出流,其使用方法和上述代码相似。高压缩率输入输出流:(GZIPInputStream和GZIPOutputStream)

<强>文件压缩

public  static  void  zip (File  srcFile, File  desFile) throwsIOException  {   时间=GZIPOutputStreamzos 才能;零;   时间=FileInputStreamfis 才能;零;   try {才能   ,,,//创建压缩输出流,将目标文件传入   ,,,zos =, newGZIPOutputStream (newFileOutputStream (desFile));   ,,,//创建文件输入流,将源文件传入   ,,,fis =, newFileInputStream (srcFile);   ,,,byte[],缓冲=,new 字节[1024];   ,,,int  len=, 1;   ,,,//利用IO流写入写出的形式将源文件写入到目标文件中进行压缩   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Android应用中如何对文件进行压缩与解压缩