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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 837|回复: 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;) L* O" k9 s. [7 `- I8 w
' d' }$ w& ]' ]$ e, V1 G, E' T

7 @1 X6 X( ]7 r/ n. F7 [& gimport java.io.BufferedInputStream;
9 A+ I+ J7 ?  P" W. }& |  M6 u+ `import java.io.BufferedOutputStream;
8 z7 @: d4 {% L4 ~4 _import java.io.File;: _% z) J. n% s# g9 w0 E
import java.io.FileInputStream;
0 M5 j+ J1 Q- Yimport java.io.FileOutputStream;
. N3 z# Y' w# ~1 U/ r7 Bimport java.io.IOException;# S" z/ ~/ O1 e
import java.io.InputStream;! ?: Q/ C7 j7 f: i! [
import java.io.OutputStream;/ ?2 T4 _9 f: h4 B
import java.util.ArrayList;+ R8 V0 w4 s& \7 v. D( P
import java.util.Enumeration;" N% \. \; p" S3 x- B" ^' I
import java.util.List;
6 k' B0 A/ @( d* ~import java.util.zip.ZipEntry;
8 b0 b' _) T' X$ h  U# Oimport java.util.zip.ZipFile;* ]& O. H7 @- X
import java.util.zip.ZipOutputStream;* X. j) `6 N9 E7 d$ T4 W; \
/**! }2 e. `) W/ k) x" T- h1 W7 P
* 此类用于测试JAVA的ZIP压缩及解压
! x& p8 ^- W" l1 ~7 g/ a1 f- G* 9 L  ]+ Q2 j% n' N
* @author Sunny Lee (2008-1-4)
  i- e: O- x2 O: M0 j  M, L2 y* @version 1.0
1 |" W3 T7 d+ D# F4 e( `$ o7 E*/1 O8 R$ c. ]- A6 ]' ]( Z+ T8 k! N% c
public class ZipManager {
; }% ^" e3 M: o' S/ J2 F. v/**
4 t* g4 n! I. s" c' R% z* zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.! s1 o8 P" ?1 e6 d3 p
* 此方法可保留被压缩文件的目录结构
' q/ a/ J$ `2 x9 ]9 w0 T*
  N4 U( d. m( i* {: t) B* @param baseDir
0 [; V- B" q5 s% N  n7 d! t4 p7 B*            所要压缩的目录名(包含绝对路径)
5 S3 h) g" h( S! X: k* @param objFileName% Q9 G( o5 l( P6 ?: x' o" V
*            压缩后的文件名" F7 m3 I% X% H; ^: I
* @throws Exception
' D% M! V0 I" m, @2 ?*/
% e# A, x  Q1 Hpublic boolean createZip(String baseDir, String objFileName) throws Exception {
0 U7 M6 T8 l1 ?. T( r" ]; }9 Q   File folderObject = new File(baseDir);
, t2 O8 W- N7 O   if (folderObject.exists()) {
* q; a; H, f* I) u    List fileList = getSubFiles(new File(baseDir));( d6 ^( ?: E7 W/ Z$ R/ n& \+ t
+ Y* n# m: k& K/ F7 ^" U0 R1 a
    // 压缩文件名
' S' }% Y; X) Q    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
$ m) q+ B8 n8 o+ E! ~# p5 b' y* \7 ^      objFileName));
: U+ M4 w* u6 Z+ f    ZipEntry ze = null;
; Z/ _7 p1 L2 f) p& g: Z5 [    byte[] buf = new byte[1024];
+ A/ ~/ F6 ]3 \1 N' i* q- E    int readLen = 0;/ [8 i: K) |; u0 h3 r6 o% a
    ze = new ZipEntry(getAbsFileName(baseDir,folderObject));
; R1 j$ [+ I* R( f" X    zos.putNextEntry(ze);% {! X8 h  C; E* c8 d+ H3 t% ]
    for (int i = 0; i < fileList.size(); i++) {4 Q0 a0 t3 n- g2 A+ G6 r) z6 I
     File f = (File) fileList.get(i);6 y# T( |6 I5 A5 Q& `: N0 y# b
     System.out.println("Adding: " + f.getPath() + f.getName());5 K# p0 b' k. M6 V8 W
     /*4 W1 p" K! D3 ~; X  R% d+ z% }
     * 创建一个ZipEntry,并设置Name和其它的一些属性
1 b9 p! D" [1 H- c) U& a     * 注意,该ZipEntry是包含目录结构的,此功能是由getAbsFileName(String,string)完成的
' W6 g$ _. n* e- t' @" W: x     */: w! H4 p% Q2 S8 d$ a: a2 I; C4 L  t0 |
     ze = new ZipEntry(getAbsFileName(baseDir, f));5 U: x9 I/ d' S* k- a$ d3 k
     ze.setSize(f.length());
8 P/ F% a6 h) j* w0 _/ m     ze.setTime(f.lastModified());7 E$ M  x5 Z7 {: A
     // 将ZipEntry加到zos中,再写入实际的文件内容
" g: E/ y- C2 b; ?) W; p/ O  h+ Z     zos.putNextEntry(ze);) y) [3 u! `7 D; x0 B# B
     InputStream is = new BufferedInputStream(new FileInputStream(f));
2 S' f. K* F- o2 |: e( [/ M) Q0 ]9 X% c# n     while ((readLen = is.read(buf, 0, 1024)) != -1) {" M! {) [* x# W. ~4 n
      zos.write(buf, 0, readLen);
( A8 G+ ]! J9 c) s! x9 |9 \     }0 ~( u# v/ y" o  P2 B- o
     is.close();
$ V+ z! F/ i( v' k- s4 j' O) p     System.out.println("done...");) b" l3 e+ U3 M! I0 T
    }! ^9 K4 v# E( g! g
    zos.close();
% }% B: X. y, x) P3 u: z    return true;
) a8 z. n9 ^- Y" ]   } else {
, P; ^/ G. E2 E- L. w3 @    throw new Exception("this folder isnot exist!");
; [9 J% j) P$ h3 j6 l   }8 q3 V, d$ c, h. V/ H% j* A
}& h+ _3 j$ V: S6 a0 q" Y
/**
* s- q& _* h, {7 a* 对某一个文件进行压缩,不允许是目录或包含子目录$ g1 W% H8 q% e1 b/ k: A
*
1 d0 F3 O" J$ K6 O! y* @param sourceFileName
! l7 ^& O1 z5 E5 u$ C+ i# {0 Y( p*            被压缩的目标文件,不允许是目录或包含子目录; n2 U; a" b4 _( V( m
* @param zipFilename7 @0 E' o& y) F& K& P0 K
*            为压缩后的文件指定的名称1 y: y" p2 d5 j* r! K7 h
* @return 压缩文件的大小
" W5 M& b3 t) i( |* @throws Exception. \  Z" i/ m8 t* y% o+ g
*/' X6 {, E" j. p6 g: U
public boolean createFileToZip(String sourceFileName, String zipFilename)
8 c( w) C" r% @3 S# i    throws Exception {
% E, X* [# y2 Q( j6 u$ g/ [   File sourceFile = new File(sourceFileName);
/ N8 f3 k) I: m" `   byte[] buf = new byte[1024];7 a$ c1 W& O: R1 ]
   // 压缩文件名/ v/ Q% K( Q  K: X' B! a0 k
   File objFile = new File(zipFilename);
' M' o# e9 e4 E  M5 h   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));
* K& g3 e  o+ A) H' r6 G- S0 a+ X   ZipEntry ze = null;7 H! J" N4 U, G( G1 H! E* l
   // 创建一个ZipEntry,并设置Name和其它的一些属性/ B8 a; R" ]6 u( A  m. v/ k
   ze = new ZipEntry(sourceFile.getName());
9 a/ C% H1 @- ]5 p& f$ a7 G6 c5 ?$ U3 W   ze.setSize(sourceFile.length());. F# |2 t+ g2 d+ A0 O" {
   ze.setTime(sourceFile.lastModified());3 `1 X  ^0 ^6 F( T3 P6 ^2 v
   // 将ZipEntry加到zos中,再写入实际的文件内容
8 T: ~, Y7 E$ ^7 R9 W: Y, _$ D   zos.putNextEntry(ze);, B4 r& [, M" ^% D% u0 w
   InputStream is = new BufferedInputStream(
) m% c5 C, J5 ]2 t, w     new FileInputStream(sourceFile));
4 r1 D, m- O$ y/ W   int readLen = -1;. S6 d& \4 z& m. t8 A& K) p
   while ((readLen = is.read(buf, 0, 1024)) != -1) {  P5 U9 {  j: z% \- y
    zos.write(buf, 0, readLen);; t) r1 V3 w: c; k: }
   }9 @  w( A/ b( N$ P3 c
   is.close();
( L4 q' V" L. a8 P- r, [   zos.close();
! g+ _+ @5 H+ b% u+ }' C7 h6 d   return true;
; X' w/ s8 W* Z) i$ a, @* W}
$ y: M2 r# T& }/ Q/**
( o6 f5 j* r$ J1 a/ w& q. f* 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.: X, L; z+ w8 \6 A( Q8 o/ n, p" M" h
*
( H* z( M( V9 O8 M* @param sourceZip& P1 E" j- M( g5 R! I. U
*            待解压的zip文件) c8 @7 M5 ^9 R( M9 g; \
* @param outFileName- q6 s) j; q2 ]
* @throws IOException" d/ O( L$ X5 H4 T2 c! x* u
*/( c* o7 {) S/ `4 t; O
public boolean releaseZipToFile(String sourceZip, String outFileName)) A2 _' b1 {) p) O9 ]
    throws IOException {
4 E. P& x& x3 [4 @4 x   ZipFile zfile = new ZipFile(sourceZip);5 r- M  ^; }  O7 C. L1 S1 J
   File fileOut=new File(outFileName);
6 O0 u0 C! a1 |
8 D7 _# m; v( }" L( I   System.out.println("待解压的文件是: " + zfile.getName());* k4 c& x9 W# t+ g% E1 \7 r
   Enumeration zList = zfile.entries();
" I7 o/ T8 s& q3 e   ZipEntry ze = null;2 [. \# O, A  K3 S" q
   byte[] buf = new byte[1024];
* V/ z3 K) o5 |! P: o   while (zList.hasMoreElements()) {
& H! \# b0 p8 [" F9 U. j; t    // 从ZipFile中得到一个ZipEntry0 J) d9 S3 A$ ]
    ze = (ZipEntry) zList.nextElement();
7 E, a& e/ e: o3 x. U- [! a    if (ze.isDirectory()) {) L6 h7 a5 v. _- |
     continue;# P' H+ u+ f; t8 C# J% W" I8 Q
    }
: Y: z/ R& A. ]1 k# U5 ]4 q    // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
; d$ t  S# I% G( @7 t6 Y" k$ A    InputStream is = new BufferedInputStream(zfile.getInputStream(ze));# f3 i+ }% z: w2 Y- ~+ T( i
    OutputStream os = new BufferedOutputStream(new FileOutputStream(* U) C  N- G% C2 d& r9 W
      getRealFileName(outFileName, ze.getName())));
5 b1 N* c/ L' v/ H    int readLen = 0;
7 e( W" ^# P9 P0 d6 U/ t! P( T    while ((readLen = is.read(buf, 0, 1024)) != -1) {1 Z/ N; k3 Q5 T
     os.write(buf, 0, readLen);
4 o/ E, Q" a( V    }2 g( B; R! X# S2 t5 a* z: ~* F4 o
    is.close();
: {% L" t- B5 U4 J/ ]    os.close();
) j; }+ f8 u6 b- N* O7 O    System.out.println("Extracted: " + ze.getName());
2 p7 M4 h& \0 o$ _: Q   }
/ s4 W9 [+ h, L# [   zfile.close();
# O; p, N  ^2 m* f' n' Z* f   return true;% j4 `; o1 Y$ C) z' p0 a
}
7 K! k# j3 @4 V/**
0 j1 F# B; _6 e4 N3 Y* 取得指定目录以及其各级子目录下的所有文件的列表,注意,返回的列表中不含目录.
& Z. \  R8 }7 f*
, m0 ]' l8 m/ ~$ q  I6 r4 q* @param baseDir
( b% Y6 |; a% a1 X/ O$ [5 u) W*            File 指定的目录4 i' u& ~1 Y6 x- e; A4 {
* @return 包含java.io.File的List+ k) ^4 }/ t$ m+ J
*/, |0 a' \0 e5 l1 @- F0 k; G8 k
private List getSubFiles(File baseDir) {
3 ^  w4 K- m1 i: d' v, k( Y$ S   List fileList = new ArrayList();
  C7 q3 }. l" X# x, j   File[] tmp = baseDir.listFiles();
" i& j" f% I" v* d: a; O/ D- W0 u   for (int i = 0; i < tmp.length; i++) {" w# `! q7 I2 ]1 n9 E
    // 如果是文件,直接加入fileList- @0 n, d4 e$ [0 O* O6 r
    if (tmp[i].isFile()) {: U. T6 Y8 J  C0 @
     fileList.add(tmp[i]);
, O1 f/ o- U+ X+ J% ]    }7 i, z, ?% d/ E0 U8 c) a# b" V
    // 如果是目录,递归调用本方法,并将结果集加入fileList6 d( X, h! F3 k# a# j
    if (tmp[i].isDirectory()) {4 ?9 Y& V) \9 V. W" y. l
     fileList.addAll(getSubFiles(tmp[i]));% y; @: d* V+ q4 P6 d
    }
9 F% A- ~5 G2 J6 P0 y: R) p6 q   }: P, x, r# X+ a- ^, b! a) Y
   return fileList;
' ^2 p  u% \! c5 X! B}
/ z3 ^% j- `% v# [# h' ]/**
# L# K8 b" y( a9 K+ Q3 e! S* 给定根目录,返回一个相对路径所对应的实际文件名.
4 K3 X5 p  [4 z' c/ H& C) W& X( ?$ z! K*
$ |+ M1 C+ E% Z$ |- Y8 H% R' t* @param baseDir8 }& h0 A( M: p" |+ y- a
*            指定根目录
, Q& t) m, \% j7 y! n* @param absFileName. f8 M& a8 l2 F
*            相对路径名,来自于ZipEntry中的name" Z9 g6 ~# f7 g6 n
* @return java.io.File 实际的文件
9 \- h, W3 e& x7 ~3 Y4 c% `*/
: |0 i: |9 H# ^: bprivate File getRealFileName(String baseDir, String absFileName) {& q6 V- n9 C( D
   String[] dirs = absFileName.split("/");+ S4 S! e! r* J8 H; u2 l. P- C% I$ [
   File ret = new File(baseDir);
4 u, F2 Z: {# V; [9 M! |5 Z   // 创建目录结构
8 {3 L! P+ p7 n" J   if (dirs.length > 1) {7 ?1 z+ s4 c% p
    for (int i = 0; i < dirs.length - 1; i++) {
! w* ^, D( v/ x     ret = new File(ret, dirs[i]);8 f! ^0 V+ I0 G& S7 r5 F
    }
1 k8 T8 ~! @+ A) n& r$ C   }  \! n4 F" e* z+ b, @
   if (!ret.exists()) {
! \+ q/ `  a! N& Y0 x* D    ret.mkdirs();  c+ n% o+ x1 n( `/ |
   }8 v" A1 [, J3 J  c9 F% @$ c
   ret = new File(ret, dirs[dirs.length - 1]);
) I8 q5 {* B, U   return ret;
/ j* _3 w. Y! O  N  ]}" e$ i/ W4 w+ y- p6 r" z+ ^
/**1 a6 U: ~7 X, m  O. Z1 V* h9 ]
* 给定根目录及文件的实际路径,返回带有相对路径的文件名,用于zip文件中的路径.
7 {, n% A# b7 Z6 m2 S; Z. G* 如将绝对路径,baseDir\dir1\dir2\file.txt改成 dir1/dir2/file.txt% u8 k+ X: Z. j6 Y% a' O' O; s
*
+ v" D! \' y! f- [& Z  S) P, |! O* @param baseDir8 \8 }* E7 A0 A& L, ?* F: }3 f
*            java.lang.String 根目录
; x5 s( [: r; ?; C( |/ m* @param realFileName
) \4 R5 @: l: \$ X! Y*            java.io.File 实际的文件名$ {- x# o# W4 D4 T' N
* @return 相对文件名7 X2 T6 Y+ E1 E1 y
*/
' N& _8 ]1 P; Bprivate String getAbsFileName(String baseDir, File realFileName) {
; N* ^, q" ?/ D& o   File real = realFileName;
& a7 I5 t2 \4 G: ]) o4 _: S   File base = new File(baseDir);7 m$ `/ k: [; l! G2 g4 x
   String ret = real.getName();+ P. [) X8 h9 q8 x
   while (true) {
; M$ O( c5 p4 B" V! f1 y    real = real.getParentFile();5 D2 @7 Y$ N, o( _. A7 A
    if (real == null)8 ?# \2 f& g3 b, u! A
     break;
# v- d7 \% J6 H7 P8 C  \    if (real.equals(base))
) d, Y: U" m, \: `0 O3 d) u     break;/ I; Z2 I; x; ?# h9 Q! Z- q  L4 D
    else {
; F: }) g' X! m! Q     ret = real.getName() + "/" + ret;0 k8 W+ L2 C" K! B
    }; }( Q  E8 V; L% O4 ], `0 x
   }
6 J+ A4 g( z* E+ c1 Q9 ~# F   return ret;
3 s! U" j; p7 u4 e/ ?}2 `; {. A5 x' S# n" R
public static void main(String args[]) {
; V* x7 w+ x* L2 d   ZipManager manager = new ZipManager();# x0 ]; R7 ?$ r2 T! ^+ O/ t2 F
   try {
2 S5 v1 W% y! g) Z: j    manager.createZip("D:\\yy", "D:\\ss.zip");
; f$ P- }9 I: v7 ]9 [: {+ ~. g2 K           manager.releaseZipToFile("D:\\ss.zip", "D:\\ss");' U% A$ m) M1 ?' H( V/ J
   // manager.createZip("d:\\temp\\zipout", "d:\\ss//.zip");
- m% ]. {8 z5 m3 e9 A   } catch (Exception e) {  I4 z, ]5 u& N$ _  f
    e.printStackTrace();
0 g1 T$ x7 W5 l2 X6 u& v   }
9 A# j- z; k% s( g' |" z( D* {   System.out.println("over");& W% Q; o$ J5 U* @# c7 J7 K
}
$ M3 m7 E1 S/ O9 o}
9 T  P4 y9 v- Y) t- f

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

GMT+8, 2017-11-20 19:39

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部