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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 1023|回复: 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;
! J8 G9 v, N2 A; \, j% @; P- m4 U( E6 R6 D7 e; X1 F
9 Y3 N' U! }: ?) P
import java.io.BufferedInputStream;
+ b/ D" H' n: Q3 |! \' W3 f9 p! iimport java.io.BufferedOutputStream;  t- n. X/ ]* d7 X! C
import java.io.File;6 g) m5 i7 T* M3 x; T" J
import java.io.FileInputStream;! j+ V' n, i) Z9 J" F
import java.io.FileOutputStream;
- q/ l; z( q9 L) Aimport java.io.IOException;
' Q' A# T' d" \7 p# Uimport java.io.InputStream;  \2 x  Y7 D; r6 W0 Q( ^  n
import java.io.OutputStream;
' e" k& U% I( j- R2 dimport java.util.ArrayList;
7 p0 G* R& B) Ximport java.util.Enumeration;
, K" h5 e0 _; V0 Zimport java.util.List;4 k" p( L$ Y- E3 r# D& M$ k
import java.util.zip.ZipEntry;+ H( }, p) l% V! V& l9 g
import java.util.zip.ZipFile;5 Q' S4 f0 g/ l2 C3 |
import java.util.zip.ZipOutputStream;
5 r9 x1 j# H5 u, e3 I1 j5 M/**
: Z& X: G/ k) K; S  s* 此类用于测试JAVA的ZIP压缩及解压% n# B; |7 W5 f) v  ^
*
% f& N( u7 @( t2 |* @author Sunny Lee (2008-1-4)# L. }! d; Q& `7 q& ]9 w+ Z- U
* @version 1.0
  M( Z4 s( H4 ^  Z8 {/ B*/
4 B9 U" I: V5 c4 \& d0 i, v3 F5 apublic class ZipManager {( y7 ^/ `2 N. X! y( Y
/**
0 i! R- A! _6 L* b& `" u: H* zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.' B/ B: X9 u6 j* `9 o- b1 e
* 此方法可保留被压缩文件的目录结构8 L* T- _- d3 M& B$ t, j0 d
*
' G- I" U2 h& F; J6 ]- ~* @param baseDir
/ J) E' c+ p% g* T*            所要压缩的目录名(包含绝对路径)% X1 b% B8 @; Q0 X3 l
* @param objFileName
1 W2 d& ~( k7 l% O" {3 R* {4 n* d*            压缩后的文件名
. m- I- Y, T# h) X3 |, m$ l/ s* @throws Exception
' J7 N; i- s) l*/
. r6 f; _+ }& E0 G% G( @public boolean createZip(String baseDir, String objFileName) throws Exception {6 I0 I7 e! B: s! b2 h5 ^
   File folderObject = new File(baseDir);
! f3 i+ h1 M1 p$ ?, A1 B   if (folderObject.exists()) {
# I: e& M+ W; p% I; k/ ?( K% z4 a    List fileList = getSubFiles(new File(baseDir));
. r; W9 j3 o" I
9 ?7 t: K  u( N( |/ u1 D    // 压缩文件名; D8 X+ p; e3 ]. c% n
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
6 J7 X) j, u2 n2 `' t3 y# ^/ p3 V      objFileName));
4 G% s0 v; W, v, M1 U* `    ZipEntry ze = null;0 O5 y( m. Y/ [
    byte[] buf = new byte[1024];
; W2 `0 e3 R( t1 ?/ d    int readLen = 0;0 k3 l5 ?# i1 M8 z& T, H# _& m
    ze = new ZipEntry(getAbsFileName(baseDir,folderObject));2 F5 \+ P/ m2 W/ ?5 n
    zos.putNextEntry(ze);% w& X  {& J# P+ n  j" Y. X
    for (int i = 0; i < fileList.size(); i++) {' s( B0 X& g& k$ P* ]
     File f = (File) fileList.get(i);
5 D& @3 X1 Q9 T' ?     System.out.println("Adding: " + f.getPath() + f.getName());" b: _* h0 l* C) v& x4 I1 V2 o
     /*+ J3 g+ Y9 K8 _  q: a' p
     * 创建一个ZipEntry,并设置Name和其它的一些属性) V0 ^: F  I) Q6 q$ V
     * 注意,该ZipEntry是包含目录结构的,此功能是由getAbsFileName(String,string)完成的+ ^3 K+ k; o  J5 h1 ~
     */
+ N! ^/ u  ^& E% l2 M     ze = new ZipEntry(getAbsFileName(baseDir, f));& q# E& h: E1 V% a% |& e
     ze.setSize(f.length());
. H6 @# F" E' T3 X     ze.setTime(f.lastModified());& ?2 F, j/ O+ x
     // 将ZipEntry加到zos中,再写入实际的文件内容
/ [4 ]4 l2 y& d% I( ^6 e, r1 J9 S     zos.putNextEntry(ze);; w# F4 X8 A* Q1 d
     InputStream is = new BufferedInputStream(new FileInputStream(f));
  B" g4 \8 P* _$ L     while ((readLen = is.read(buf, 0, 1024)) != -1) {8 i/ [; l, k' v3 I4 S. S4 A
      zos.write(buf, 0, readLen);/ }7 \0 A9 }6 a1 A: w3 h' Z
     }
. W" B) d$ {: c5 _0 @     is.close();
% A" _1 h. \+ ~9 a0 ?) u; t     System.out.println("done...");: d! s: S3 v9 r9 g- Z
    }
9 g1 J! v0 E1 M    zos.close();  C4 u  T. f7 O# ^
    return true;
( S. O+ ?# W' a   } else {1 i/ b+ x4 P9 ^+ R0 `' y
    throw new Exception("this folder isnot exist!");! p( Z  R% y) i. ?' k
   }' q/ S$ \( i, L: v$ ~8 F! \# g0 o
}
% Z- p. l. i, v: O" V/**
9 v( t) h$ \# T6 T  p$ d- r* 对某一个文件进行压缩,不允许是目录或包含子目录1 D# B( v  e5 v  t( {# u
* . X* q+ ?$ z$ L
* @param sourceFileName
2 n9 O; Z/ j) A6 ^( z" T*            被压缩的目标文件,不允许是目录或包含子目录
2 M4 T9 ]. s1 V4 [* @param zipFilename5 S4 f: ?$ `; m: i% L
*            为压缩后的文件指定的名称" {+ [& ~$ z( U
* @return 压缩文件的大小2 I% M! Y& `* T, O/ o/ v; ^9 e
* @throws Exception
9 m- F7 N, @8 o; J& L*/( O7 j9 `6 l' l
public boolean createFileToZip(String sourceFileName, String zipFilename)
4 t5 t3 A9 Q" Q) c* E$ y3 p9 ?    throws Exception {5 s0 O( ~3 T4 Q+ ~
   File sourceFile = new File(sourceFileName);+ G3 j. X: u* y- c
   byte[] buf = new byte[1024];
1 o* a- e: J+ V1 N4 l5 _4 o   // 压缩文件名0 p8 _& u0 a6 L4 M9 o; L/ i5 W
   File objFile = new File(zipFilename);/ c+ Y5 T5 n* O6 D' o1 u2 b
   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));
$ a" F: C' a+ ~   ZipEntry ze = null;
* O0 f  W6 r0 [- H( ~% E( Z, K   // 创建一个ZipEntry,并设置Name和其它的一些属性
6 F7 ]' [- |; [; f5 \   ze = new ZipEntry(sourceFile.getName());" y4 ]4 f7 B& [
   ze.setSize(sourceFile.length());" T$ m! G6 u- @
   ze.setTime(sourceFile.lastModified());
: |$ _6 t4 G! T( o. T7 c' D9 [9 n   // 将ZipEntry加到zos中,再写入实际的文件内容
) w, R% \+ @; Q" t   zos.putNextEntry(ze);) }& e/ c4 g* H
   InputStream is = new BufferedInputStream(
- Z* y' V( p, [/ P- m# F     new FileInputStream(sourceFile));, ~' |0 o0 W+ ?  _8 {- g; I" {
   int readLen = -1;
4 G: v1 v/ k7 N+ U$ q1 C+ a- ~   while ((readLen = is.read(buf, 0, 1024)) != -1) {
! C0 r7 [+ S. y2 K& t0 ^5 }9 z% ~    zos.write(buf, 0, readLen);7 z* i2 T5 T& O) R
   }
  n5 O9 B, L" O! z" B6 X   is.close();$ p& b4 U( t8 G& a/ \' A! ^# K" |
   zos.close();
3 W* t. D/ B3 F   return true;" a$ y. Q) P* V4 w2 c# w+ R
}
  x4 n$ w7 ^& P! A/**
2 U  z& ~2 M( N6 S. J+ d* 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.
% [) ?5 u, R* ~- u+ N*
  W" L3 B9 Q+ H9 ^) q* @param sourceZip# }6 s) R) Q7 M
*            待解压的zip文件
9 d# }$ M' {% Q5 y9 @& F+ t' L* @param outFileName
  u$ t6 V" u% y, D1 _* @throws IOException6 q9 v/ W0 R+ n
*/8 i2 n7 U6 M4 B6 W5 U* b. i8 \
public boolean releaseZipToFile(String sourceZip, String outFileName)% F" O5 M* S7 n% s
    throws IOException {2 `! v! O9 P! O! [7 S! Z) W
   ZipFile zfile = new ZipFile(sourceZip);
) h3 |  A6 N. w% s8 s   File fileOut=new File(outFileName);
$ ^% k$ H) ?1 p, Z. M5 F! n/ b+ Y& L9 g. [8 J$ W6 W0 s! O+ T
   System.out.println("待解压的文件是: " + zfile.getName());, J3 D* ^0 U  c5 Q4 \/ g4 h
   Enumeration zList = zfile.entries();, _6 ^. V0 s5 G9 j9 p: T  u" i
   ZipEntry ze = null;4 ^$ f6 d  c8 |% V0 ~) v
   byte[] buf = new byte[1024];( w% o; f" [- l0 u
   while (zList.hasMoreElements()) {
* v/ L/ A9 d! E, y( K% V8 |    // 从ZipFile中得到一个ZipEntry
( a$ A  S. x4 m1 \    ze = (ZipEntry) zList.nextElement();
2 y4 I3 Z2 B6 a2 _/ V5 t    if (ze.isDirectory()) {$ j9 \8 }; K% o& I
     continue;
) B' U3 y8 Q6 F, H9 P4 `. X% n    }
5 A: h9 C/ A  \  z1 ]. M6 q    // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中* h1 N& ~; c3 t6 X0 z
    InputStream is = new BufferedInputStream(zfile.getInputStream(ze));/ t; i" N) s6 C% a! r. R) ]
    OutputStream os = new BufferedOutputStream(new FileOutputStream(
7 }  C' N* c6 W9 Y" q9 n& a      getRealFileName(outFileName, ze.getName())));
0 k2 |$ X: F& N$ i    int readLen = 0;
' j3 I  Q8 |' L" O. b: @3 M+ f    while ((readLen = is.read(buf, 0, 1024)) != -1) {
% \6 H9 g% |3 A5 m9 Z     os.write(buf, 0, readLen);  D; G1 p7 M/ D# x
    }+ ?  b& S) n; P1 u
    is.close();
3 y8 L; z4 v9 _; g' A. H. x- `    os.close();6 ?. Q8 u  E) ~7 x
    System.out.println("Extracted: " + ze.getName());
1 o$ `- A6 u0 B6 z' K) P# l1 d8 c4 K   }, m/ C0 x2 n2 N: m) Y) i! s5 I$ V
   zfile.close();
2 P8 m5 F6 C4 b$ x3 G   return true;8 E9 x0 V1 \- I
}" }7 S. m# F8 L3 o3 S1 Q1 [4 z
/**
% j7 n- t4 U: V- m. A! H* 取得指定目录以及其各级子目录下的所有文件的列表,注意,返回的列表中不含目录.
0 M  f* W" |1 Q*
  X7 ~% ~5 U& T2 T$ T; }* @param baseDir
6 d2 m+ ?# r0 H$ A0 R! g*            File 指定的目录
( q' ^( _- |5 q% a( n. }* @return 包含java.io.File的List9 e9 ~% d* {" r* p
*// H. Y# c7 h- v4 O# X
private List getSubFiles(File baseDir) {  y: w& N2 k$ e( `, ^* x- S+ q
   List fileList = new ArrayList();% v9 `: ?# E! K/ B+ Q
   File[] tmp = baseDir.listFiles();
; f$ |: U9 ~) q! F6 H) _4 G4 R/ T   for (int i = 0; i < tmp.length; i++) {
% p( m" q! s3 F. E9 y0 X    // 如果是文件,直接加入fileList
0 f! n9 ^' K6 {0 b$ Q6 {  l3 o    if (tmp[i].isFile()) {& y; n1 @7 Q. b6 E3 i: {7 o) h! [- P
     fileList.add(tmp[i]);3 s- V% H- U; a% S
    }' s# o& I8 s7 O" @
    // 如果是目录,递归调用本方法,并将结果集加入fileList4 a" c0 j1 L0 T8 R$ u9 C
    if (tmp[i].isDirectory()) {
. I7 r( @4 K( {6 s     fileList.addAll(getSubFiles(tmp[i]));7 m+ i" ?* z4 v: B5 i0 f- Y% J% Q
    }
& D' Q) A  s$ j0 Z8 ~  z4 G' h   }
* q2 S' \7 `, ^% t, y7 @; w   return fileList;
9 ^* g* Z: i1 |" ~* g}& R, L/ v0 v. ^/ Q5 Q/ d# ?! b7 J
/**5 Z6 K& b: g- d: `  f
* 给定根目录,返回一个相对路径所对应的实际文件名.
1 b0 G# _8 l3 _$ \' U3 z7 i* ) A9 Z$ u6 B- O7 Y5 i! e2 n
* @param baseDir: R- F- N; f% p1 k, T9 {
*            指定根目录
+ Z  R+ j# J$ R: M* @param absFileName# b. G1 B/ @9 ?0 e' z
*            相对路径名,来自于ZipEntry中的name6 w- ], s' w1 k5 x1 i9 H+ p, P
* @return java.io.File 实际的文件* A; T0 Z5 @, w8 H: K
*/
+ c- C, i6 V% k0 e0 tprivate File getRealFileName(String baseDir, String absFileName) {
0 [$ V( l6 T% c; z   String[] dirs = absFileName.split("/");" b3 {$ j9 Z. H6 x3 J/ _; J
   File ret = new File(baseDir);
8 ~3 t6 W8 w+ d0 l) T. H   // 创建目录结构
% r! v4 k; W2 N& `   if (dirs.length > 1) {
2 G4 U$ n( ?+ q. t( G, t1 a    for (int i = 0; i < dirs.length - 1; i++) {
! g: |$ s, ]$ n1 u5 Y     ret = new File(ret, dirs[i]);
. p* s6 m) J6 J* T7 I. d2 L    }7 f5 Q6 J6 e8 Z, z
   }+ v! J$ v/ [6 J' J
   if (!ret.exists()) {+ V3 @9 `& R9 _' ^, m9 R1 R
    ret.mkdirs();/ H, ?% c% H7 q* S7 Y$ I) ~% O* C
   }
7 V( P, z1 B% g% \! G2 ^: D   ret = new File(ret, dirs[dirs.length - 1]);
; U! w3 c9 w! N+ _/ a   return ret;
+ y' b6 H5 t0 t1 D; T; v' [9 x' F/ L6 V}
9 N4 X4 y3 V/ A# O: f1 h& G6 f/**
/ A* I( Z( p/ ~$ @8 D* 给定根目录及文件的实际路径,返回带有相对路径的文件名,用于zip文件中的路径.9 c: b  }* ~# k7 z
* 如将绝对路径,baseDir\dir1\dir2\file.txt改成 dir1/dir2/file.txt
, `9 l- u9 R/ [; V0 e  y/ y8 ^*
' I6 @, h+ C1 [; ^9 u0 J) B* @param baseDir. ~; W9 }3 ^3 a. J1 v, d
*            java.lang.String 根目录9 Y8 H- u5 w  j( J# v: \: ^/ s8 C
* @param realFileName
9 ?+ o1 H; F) x*            java.io.File 实际的文件名- x5 `/ _3 o( s( {
* @return 相对文件名
' Z5 x$ f# D0 X6 i  z*/- ]- ^' {5 m# G) e
private String getAbsFileName(String baseDir, File realFileName) {# K, e/ z) N& b$ e9 r
   File real = realFileName;
9 G# X# A, R' \/ o- B. \  U2 A   File base = new File(baseDir);
% s2 i0 T6 }  {! [' z0 H  n$ K   String ret = real.getName();
, m; a: J/ s% t! X   while (true) {+ ?+ t7 z; Y( O  W+ k# Y/ E
    real = real.getParentFile();# t2 X0 V5 t1 j
    if (real == null), N) e3 P) d) Q
     break;
- A( t# S. F0 A" T0 l/ e, V    if (real.equals(base))& Z+ p2 `' Z# S& D9 s* d- o% Z
     break;
7 Q+ E3 v& R3 ~    else {
. U- N3 x' T: _* w     ret = real.getName() + "/" + ret;
9 U8 a  {0 c1 i$ J* |' _0 C8 w    }
/ O, h' O' X' z2 T/ j   }
0 ^* Q2 \" Z' G+ W' ~   return ret;9 X3 W, _# E. N* K; S
}
/ _. H% v4 d* d- s2 npublic static void main(String args[]) {
* g. c3 X: E' h, C5 G   ZipManager manager = new ZipManager();* D3 ~' X7 F( i2 l! R+ Z' C# n8 l
   try {
, K& d' Y* }3 d! a- ~) g& P    manager.createZip("D:\\yy", "D:\\ss.zip");
  L# u+ j8 w" k' i! I0 P4 }0 u' f           manager.releaseZipToFile("D:\\ss.zip", "D:\\ss");9 w$ }! h4 B1 n. L7 b, i0 J
   // manager.createZip("d:\\temp\\zipout", "d:\\ss//.zip");
+ L% \& s. |+ F   } catch (Exception e) {
# O9 n2 S+ u, M2 |: S7 _5 i    e.printStackTrace();
, n$ N5 F/ A% j; {   }
# f9 Q+ y" i  y0 V1 d( V   System.out.println("over");
5 s8 E5 K. v: F+ v6 U}! `' a+ P/ f: e, W! p1 n0 p6 H
}0 P  Z) p3 ^  m

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

GMT+8, 2018-10-23 15:30

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部