设为首页收藏本站
机战Z2破界篇 星组汉化 下载

星组游戏论坛

 找回密码
 注册(QQ注册+邀请注册)

QQ登录

只需一步,快速开始

查看: 987|回复: 0

[资源] 文件和文件夹的压缩和解压(android平台) [复制链接]

Rank: 11Rank: 11Rank: 11Rank: 11

UID
100286
星币
12
积分
1
阅读权限
90
注册时间
2013-9-4
最后登录
2013-9-9
发表于 2013-9-9 14:05:10 |显示全部楼层
package com.junling.service;
. x3 x! ~: n- z6 \6 ?4 D) o: ^( m1 ^: d6 ~7 n$ m

+ D* F( t+ D" I0 Zimport java.io.BufferedInputStream;
/ F( ~- v& m" I7 U/ ]import java.io.BufferedOutputStream;( [( p5 u$ q* F4 D6 ?
import java.io.File;
/ ~. L; e2 \7 Z/ bimport java.io.FileInputStream;
3 }: G6 j$ e! p. }" w9 [3 i, Gimport java.io.FileOutputStream;* n' `* g" J! l  j
import java.io.IOException;
, A7 t3 |' e( h( s' U, D& Dimport java.io.InputStream;
6 @9 `; J# U! K  I' q1 ~" [: T7 Iimport java.io.OutputStream;) F! k4 ~+ ~# T9 Z
import java.util.ArrayList;* r  A, f. N* i
import java.util.Enumeration;! S4 Q# w3 O4 Y! _. e" T
import java.util.List;
8 E7 J* Z/ x) g1 X/ X$ eimport java.util.zip.ZipEntry;4 j- P: \! G9 x3 x: E
import java.util.zip.ZipFile;
. F/ F5 O/ M, R2 t; W9 h/ Mimport java.util.zip.ZipOutputStream;0 R! m+ O( U( y: K& P
/**
# ?9 F1 Y& b9 x" Z* 此类用于测试JAVA的ZIP压缩及解压
+ T+ c2 h! i. W* & W, g7 x3 O* D! q8 x9 [1 c. D
* @author Sunny Lee (2008-1-4)0 y. k7 F1 W9 ~1 b5 B, D
* @version 1.0
/ _. Y9 z. W3 ]. W& T. X*/7 o3 |, h5 A5 @3 i# c6 O" w1 a
public class ZipManager {
) m+ r  m" J) u( M' ?+ E/**
5 a- m+ l" I; [$ {- L* zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
4 @' f# V; D  }0 j4 [' l* |* 此方法可保留被压缩文件的目录结构6 L! P' A3 t3 E5 e( R
*   N% g- R" v8 O- F$ D
* @param baseDir
0 c9 N% V$ u# ^% }2 J% U( F  i*            所要压缩的目录名(包含绝对路径)
. k" C+ o: U3 e4 F; ]3 K* @param objFileName
7 o$ ]! W$ y, T4 Q) G*            压缩后的文件名8 c  A. q/ I& Y& o# w
* @throws Exception
$ F$ V) S- o/ H) Y9 k*/" X& o: x7 h/ u
public boolean createZip(String baseDir, String objFileName) throws Exception {+ P5 p$ w5 s  C1 R( v# W* K
   File folderObject = new File(baseDir);9 ~6 n# W* E( v/ a' q
   if (folderObject.exists()) {
  }8 z) S3 s2 K; J0 H2 _    List fileList = getSubFiles(new File(baseDir));# ~8 d' m* C$ C! ?: k$ P' T

$ X: [* C7 `$ f$ z5 }    // 压缩文件名
+ a5 L1 E) h, h9 K    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(  F- D9 o  f' U
      objFileName));$ ~7 Y* @# L3 g/ y/ Y0 R
    ZipEntry ze = null;
* W9 Z% O. W4 u$ }    byte[] buf = new byte[1024];
; L/ ]9 r' S1 l2 z    int readLen = 0;
4 Z0 B! l) p( w4 q9 l! k) [) A    ze = new ZipEntry(getAbsFileName(baseDir,folderObject));6 r, l# L. [6 t6 [$ ?8 m* w" \
    zos.putNextEntry(ze);
, O5 }: |# j& }/ g; f8 W    for (int i = 0; i < fileList.size(); i++) {" ?7 |; c( v3 L
     File f = (File) fileList.get(i);
( W8 s; z* D0 }. X+ j0 q/ }     System.out.println("Adding: " + f.getPath() + f.getName());& E# G0 N- _6 l  B7 k
     /*
% Y& n- ~0 ^& M5 F5 ]- i1 C. O+ W     * 创建一个ZipEntry,并设置Name和其它的一些属性% y  ]: z; F9 @& g+ m
     * 注意,该ZipEntry是包含目录结构的,此功能是由getAbsFileName(String,string)完成的4 B5 [+ [5 b1 D6 M
     */+ x* w( q' Q; @1 N; k4 i7 b
     ze = new ZipEntry(getAbsFileName(baseDir, f));9 B) o( K- S+ H5 `$ G, ?7 k" [
     ze.setSize(f.length());" f4 M( I- l4 W- m# y. I4 F# s
     ze.setTime(f.lastModified());
1 v6 N# q7 w+ B0 _2 z# ~& b' ]     // 将ZipEntry加到zos中,再写入实际的文件内容! @" ?" @; y7 h8 T' X4 k2 }$ A" |
     zos.putNextEntry(ze);
4 V; d2 e* g9 n     InputStream is = new BufferedInputStream(new FileInputStream(f));8 Q* D3 O& Q) d. k! j. D
     while ((readLen = is.read(buf, 0, 1024)) != -1) {
- f" {2 T. c3 U  T3 K$ V      zos.write(buf, 0, readLen);6 I: h* p0 }* E/ Y5 }% C1 d7 Z% H
     }
* _0 Z- [7 C: y/ f     is.close();; t% V2 k; V& y
     System.out.println("done...");
# X( L# K* T  `: ^    }
9 h' Q* B- j& d    zos.close();
' p. H  r7 \* @3 [/ Y    return true;3 s9 x. |$ j  k" K# g# O
   } else {  }% w1 s  p7 k" G; i0 r
    throw new Exception("this folder isnot exist!");$ ~9 t' f1 D1 @4 k9 ^3 g+ m+ _
   }
: R5 ~8 b# l+ W+ z8 z}
- V$ @3 D* B* X1 Q2 N/**
6 l; b5 i) ~* k' K8 C* 对某一个文件进行压缩,不允许是目录或包含子目录
! O: C: L/ @: ~7 q1 L7 N*
% V# R5 v0 s) F) X6 S* @param sourceFileName
! X* Z7 o+ N4 H: r: n*            被压缩的目标文件,不允许是目录或包含子目录* K- q0 ]( ]( A# t0 Y- w' y
* @param zipFilename
  }' X0 Z5 l5 |  _) L*            为压缩后的文件指定的名称
: s' v8 V% P  ^* A9 u) K* @return 压缩文件的大小
" ^% Z7 |, M3 z* P2 G; V# t* @throws Exception3 L! m2 q7 C) E4 J* W. T* P
*/7 h0 I' J; ~$ d  c. L
public boolean createFileToZip(String sourceFileName, String zipFilename)' \+ K. D& X( Q7 |! k
    throws Exception {. j/ g. A+ o+ ~8 T* Y4 p
   File sourceFile = new File(sourceFileName);8 ?6 K! W, t1 y
   byte[] buf = new byte[1024];! L6 z% U  h+ i4 q/ c
   // 压缩文件名/ b1 m- o! |' \" f. a
   File objFile = new File(zipFilename);, t2 G' Z. d4 }. D9 i6 t
   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));# Y1 W$ v# U+ d8 a/ |9 J5 x8 g
   ZipEntry ze = null;7 r! ?3 h; _7 A0 l  D) t
   // 创建一个ZipEntry,并设置Name和其它的一些属性
' ^  O* u6 L$ P7 o& V: A  @5 `   ze = new ZipEntry(sourceFile.getName());
. i: Q1 q8 G- G) a  e$ c- z9 n, G0 m5 `   ze.setSize(sourceFile.length());
# c5 @( D; G  k9 \   ze.setTime(sourceFile.lastModified());
- v. X$ W& k$ N; |" I3 W1 g   // 将ZipEntry加到zos中,再写入实际的文件内容# x- D4 M9 s  E. n1 L+ B
   zos.putNextEntry(ze);' K5 i% @7 T6 }4 D7 ?1 ^/ R
   InputStream is = new BufferedInputStream(8 t/ E# }, |, f8 o( `
     new FileInputStream(sourceFile));
3 b6 O# b& A6 ~0 Y" a* o& ]   int readLen = -1;; [/ M* A  z/ {
   while ((readLen = is.read(buf, 0, 1024)) != -1) {2 ^  O) w0 k% F" G' n5 P" t# X
    zos.write(buf, 0, readLen);
- b- L$ l( D5 j, X9 e0 `/ K   }' n0 k$ j8 x( H. t. ]4 U! k
   is.close();; H, G8 s8 {- D2 s2 A7 E; E+ X: g2 R' ?# m
   zos.close();
- p8 C0 z) r3 q6 q4 s+ Z: e2 F; p   return true;7 N# t7 J0 Q2 h/ b/ }
}7 `5 a% X9 S/ }
/**
' V6 p( f4 r, e3 c2 m8 K# q* 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.7 t# c& x" M$ D" s9 L$ w  _
* : d+ B4 N" f2 H
* @param sourceZip
* S4 z, M" M1 s8 I*            待解压的zip文件8 @4 f; G& Z8 |- |. }' N9 A' i: Q
* @param outFileName5 j  O0 w6 U3 D
* @throws IOException
+ M9 ~9 G7 w+ y*/! r8 d; \6 }0 H* K% |
public boolean releaseZipToFile(String sourceZip, String outFileName)
$ T9 c4 l) i6 ~    throws IOException {, f4 A1 V3 E9 W# K% R# o/ k4 W
   ZipFile zfile = new ZipFile(sourceZip);
" b6 {! \- Z' ^  o. J+ T   File fileOut=new File(outFileName);3 c; u, M+ H0 M# H9 l' t% I
  z) b  @# N" R
   System.out.println("待解压的文件是: " + zfile.getName());; k7 M$ i  {# t6 m
   Enumeration zList = zfile.entries();# @0 T$ i7 K0 {+ o
   ZipEntry ze = null;
$ j5 {& }# j' X% o' n5 p0 ^   byte[] buf = new byte[1024];
* ]& D$ S+ R, w# L$ @& ^: ?   while (zList.hasMoreElements()) {9 ~2 s2 Q) \1 {6 v* C8 p
    // 从ZipFile中得到一个ZipEntry
6 ^; d/ t+ ~% R3 R  _* O    ze = (ZipEntry) zList.nextElement();- q; Q4 c, Q  V
    if (ze.isDirectory()) {
( j! N6 k8 J5 I4 g+ P8 d2 z0 S     continue;
( @7 V  m, p& s: y( O    }
/ v3 v1 c4 M1 m. S) M, T0 ^    // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中* W/ B: T( I2 y' a% e
    InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
+ _2 m  h2 K  ?9 q! t$ u    OutputStream os = new BufferedOutputStream(new FileOutputStream(
" R) I: V: K0 t      getRealFileName(outFileName, ze.getName())));
5 o' |/ F' O2 i* M2 F- w! O% q    int readLen = 0;
% X1 ^* w& U; z+ `    while ((readLen = is.read(buf, 0, 1024)) != -1) {: _7 e) i; P) I* G
     os.write(buf, 0, readLen);& q8 t% o6 m2 l0 c& I! N
    }6 p& K0 U; l( o" W5 O7 o( [
    is.close();2 G7 V( c& x9 C# a+ M+ O9 k
    os.close();& O$ ]8 m8 ]7 i0 b
    System.out.println("Extracted: " + ze.getName());
& _( {' `) J" m5 b  m, f   }
* J- n. U7 M; A$ j! |. V   zfile.close();
. Y' g5 e0 W  C. }+ @4 o   return true;2 q3 ?7 P; k3 [! h
}
* \, q; z4 G; k! x. s- Y, u/**. I  `! M$ j3 ^
* 取得指定目录以及其各级子目录下的所有文件的列表,注意,返回的列表中不含目录.
! \1 M/ d) \9 f# O( }* 0 n3 m& M3 M0 z7 d/ _
* @param baseDir# @, r3 Z, o# P
*            File 指定的目录
4 S: m0 k# e' B' v* @return 包含java.io.File的List
- s# _7 Z7 [) |3 E*/
: ]: \7 N' g# ^& o4 Eprivate List getSubFiles(File baseDir) {# J9 ?- J5 }. X  I- Q4 N2 s. i
   List fileList = new ArrayList();) ~& `' B: M5 t! }
   File[] tmp = baseDir.listFiles();5 q' F7 V; X7 z& e7 w
   for (int i = 0; i < tmp.length; i++) {
, D# |4 Q: B4 }' I8 P% |  k- H    // 如果是文件,直接加入fileList
+ e( |8 P* y1 @% O3 t    if (tmp[i].isFile()) {
/ g4 Z4 O& F1 r0 f/ i( I, q, b     fileList.add(tmp[i]);! t( R" a6 G6 n/ z
    }
6 [$ F( C1 \$ `7 Z2 Q: ~    // 如果是目录,递归调用本方法,并将结果集加入fileList
( W+ u% z! R% U6 Q5 z, \& H- C    if (tmp[i].isDirectory()) {; h& L& k/ H1 c+ q$ y% ]
     fileList.addAll(getSubFiles(tmp[i]));/ H/ P: N, }" a6 v: K* g. k
    }
, z, C0 p7 D/ Q! S& w0 i6 t   }
0 E  X/ V* D" [   return fileList;
" h) r  k! m0 p& m/ u}
0 c! h1 ^  e  t4 o* @% @/ K1 S/**& ?% f. a; W0 J. Q; V' j
* 给定根目录,返回一个相对路径所对应的实际文件名.
" C# L/ D: u7 a2 j( Q+ Q& r& O( u* ' @5 P7 r! l! k+ B  }( D
* @param baseDir+ D3 N( l6 h/ \3 B: \( Y2 ?
*            指定根目录, X5 j0 c7 P* _8 @+ w
* @param absFileName% b0 Z4 l* d( Q' [7 p
*            相对路径名,来自于ZipEntry中的name
  P( G0 a. s* E+ ~2 F* @return java.io.File 实际的文件* Z' k2 s/ R. m  F
*/
4 C0 Z! j" D* ~5 |# ]# jprivate File getRealFileName(String baseDir, String absFileName) {0 g, v& N6 |4 S/ C, g
   String[] dirs = absFileName.split("/");
- ?% h( w1 K$ l& V1 ]7 |! y" p( [" ^   File ret = new File(baseDir);
6 B0 G4 c2 \7 N  G; [# k0 I! X1 l   // 创建目录结构& _  x% C) o& F
   if (dirs.length > 1) {4 M( l3 d8 C$ f1 \. n' M( y8 ^$ m
    for (int i = 0; i < dirs.length - 1; i++) {. [8 Q. X' Y' x& J3 {+ q
     ret = new File(ret, dirs[i]);0 h* u; B# o3 P% w% j
    }
) d4 r( t2 G1 n# ~, h   }9 {3 K! E3 L$ S
   if (!ret.exists()) {, }$ u$ n4 k. p2 f) q
    ret.mkdirs();- Z- ^' R' U- W$ n$ Z  C, @
   }: K; j2 K: E( G9 e
   ret = new File(ret, dirs[dirs.length - 1]);
3 g5 t/ h6 t3 s7 s, }; X7 J% U   return ret;
: e( ?# O; C/ n, d2 D}3 X: S+ Y+ B$ }5 w& c5 K) C4 w3 K
/**
- q3 ~1 c& l) O# Y2 @* 给定根目录及文件的实际路径,返回带有相对路径的文件名,用于zip文件中的路径.
& v- ~9 w$ k" Z* 如将绝对路径,baseDir\dir1\dir2\file.txt改成 dir1/dir2/file.txt9 t$ V. N$ u7 z0 H2 K
* 0 P" k5 F* a+ \
* @param baseDir1 k+ {& p3 o6 u( c' ~3 \3 m( b0 E, x
*            java.lang.String 根目录
5 d/ C: g2 {) d2 D* @param realFileName
2 s# f+ t6 J1 X6 d& V% J7 {3 Y*            java.io.File 实际的文件名  ~# m1 \- Q4 D) V2 n
* @return 相对文件名5 f% y0 s, W1 v8 @  K9 _
*/
. M; o3 J; j  ~8 H8 N. n1 nprivate String getAbsFileName(String baseDir, File realFileName) {2 g2 _, i% g8 H( t& v' H4 a, K
   File real = realFileName;
) \" J( i8 Y& _2 o) t1 Q$ n   File base = new File(baseDir);
: t' ?1 G' k) N" t5 H% B: ^, H   String ret = real.getName();
0 U3 ~: a: Q! `* ?   while (true) {
1 w3 c3 N5 N2 r8 p. q! O/ a    real = real.getParentFile();2 ~' L* Y8 s' w, f! @2 s* B! r
    if (real == null)
5 Z, Z0 @3 ?! t) H0 a* c0 c     break;
( v3 u! A0 d6 a% b0 W" p/ M1 \4 U    if (real.equals(base))4 @' _; E$ v2 E# T$ \, \" y6 }
     break;
5 g! d1 Z' d; L  q% |    else {
% g3 L% I1 _9 Q+ |     ret = real.getName() + "/" + ret;# K7 L' R2 m( I8 O# R. E
    }
9 _; R% M3 s6 @1 ?   }
+ r- N( }, c  u6 r4 d   return ret;: G7 L6 ^. M0 W% ~
}3 J* I, B1 z0 X4 K& b8 O
public static void main(String args[]) {
: C' b; E$ ]# Z' F) N% o   ZipManager manager = new ZipManager();
: }" u0 _* K: L6 \   try {3 N! u5 I( J) X+ T2 [  a/ ~2 Y
    manager.createZip("D:\\yy", "D:\\ss.zip");
1 ~" d$ {9 m2 _8 a           manager.releaseZipToFile("D:\\ss.zip", "D:\\ss");; u* a: Q- ^2 P) d
   // manager.createZip("d:\\temp\\zipout", "d:\\ss//.zip");) R  C4 O4 m& Z. \& v/ @8 i; R) C" _
   } catch (Exception e) {0 h3 U& Q0 l# B8 a
    e.printStackTrace();
0 {4 Y% b- @  {7 g* j" @   }
/ j& u0 v/ v; a   System.out.println("over");
' l- B- x5 T  A4 E8 ^  F/ l}1 l3 B/ _% A. _! ~# z8 j( Z
}2 ~, F' F. V4 C

Archiver|星组游戏论坛 ( 京公网安备110403080002 )  

GMT+8, 2018-8-17 19:47

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部