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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 859|回复: 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;. A9 j8 |  z6 F
' ]: a& J( K* ~, r# o: c
0 L. g* N' B1 k: {/ j- ^3 T0 `
import java.io.BufferedInputStream;
3 T: ^* b; }' g4 a8 [+ zimport java.io.BufferedOutputStream;
3 R' w0 D" L3 t, W. l. Wimport java.io.File;- D1 |+ ^% u3 M& x+ Y% V* ?9 u% w% D
import java.io.FileInputStream;
/ }; k9 v: A0 q- M3 bimport java.io.FileOutputStream;3 i: v! e* Z# Y8 b
import java.io.IOException;
* I: |# @2 b8 e" Vimport java.io.InputStream;
$ c" x- h( L. e& |# V. X( e% aimport java.io.OutputStream;7 K8 j! ^) G/ P  T! y
import java.util.ArrayList;
/ r6 }& s4 s% Y% `2 I  n/ {import java.util.Enumeration;
; R  B6 i( V# T/ Zimport java.util.List;: N- k2 b& j( w" V, I
import java.util.zip.ZipEntry;
3 N8 Z7 d+ }8 k/ W# x. O/ F2 e3 n5 Zimport java.util.zip.ZipFile;5 r' W* A7 N+ F9 ~1 f
import java.util.zip.ZipOutputStream;& E0 q- v" q0 R4 }9 w# v8 F$ b
/**+ p. C0 |$ ~7 s* w' q) x
* 此类用于测试JAVA的ZIP压缩及解压
5 ?4 ]7 f8 R5 O: I+ K' i3 s* 0 v) Z* U" j$ I) j. a. p0 B$ ~! k
* @author Sunny Lee (2008-1-4): C; s1 v& Y' q8 [9 a
* @version 1.04 k9 J9 G+ ?- [# H1 e  e
*/
3 u; D2 r4 I7 z7 fpublic class ZipManager {- t4 M* v/ n3 ~& O/ m) B
/**
# s6 H/ q4 G. @1 W3 p6 u  S* zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
5 H+ b" Q. l3 ~' `3 ?9 }  B* 此方法可保留被压缩文件的目录结构9 U7 N( F8 z% w3 u3 s; V
*
8 E- I7 s; D- n/ r& ~* @param baseDir  U; e5 T7 _6 f( n: a+ j$ l
*            所要压缩的目录名(包含绝对路径)
, y' ]( a# I7 G$ e& T* @param objFileName  v& N$ n. v# K
*            压缩后的文件名5 T, a% V/ M" K8 U
* @throws Exception
8 w# I* M3 A8 L*/
( q. @6 f+ p9 y9 }public boolean createZip(String baseDir, String objFileName) throws Exception {2 T, ~# e0 E  c$ K
   File folderObject = new File(baseDir);, T, r) p; Q" k- @
   if (folderObject.exists()) {
; w0 M- F! P, Y) D4 e" ^    List fileList = getSubFiles(new File(baseDir));
7 r. d: u6 ?- Z6 g/ t3 T# ^6 r  x3 q3 _2 j% ^, y0 V1 w: J% L4 |& |
    // 压缩文件名
; A( |' `: [/ h# t* b( {1 n! \    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream() _) _% b7 Y+ T  g8 T
      objFileName));1 `0 D4 {2 P  i( m% Q
    ZipEntry ze = null;
3 \% J3 W+ c0 e0 @/ a3 H    byte[] buf = new byte[1024];
6 C: C! x$ t! i* m" t$ C' x2 |- h4 f    int readLen = 0;" |  G: e( j. b" ]
    ze = new ZipEntry(getAbsFileName(baseDir,folderObject));
/ l6 f# c4 u( L! a9 _* {    zos.putNextEntry(ze);) h% H/ m3 t2 f1 e
    for (int i = 0; i < fileList.size(); i++) {
! p" F; r/ Z* R" @( P     File f = (File) fileList.get(i);! A: V+ N+ L8 T3 z
     System.out.println("Adding: " + f.getPath() + f.getName());
1 a! a# v. t3 T4 U     /*
* j/ G$ {- j! A. _9 B* |     * 创建一个ZipEntry,并设置Name和其它的一些属性( k5 T/ d* }5 a1 R. ]/ c
     * 注意,该ZipEntry是包含目录结构的,此功能是由getAbsFileName(String,string)完成的; D! h- R/ ~# @  B$ s6 V9 O
     */# E- S+ B% R7 T$ s1 Y+ T
     ze = new ZipEntry(getAbsFileName(baseDir, f));
- {; Z+ F6 _0 @( m- `     ze.setSize(f.length());
* v, P( L: g$ ]  n" }6 P4 S     ze.setTime(f.lastModified());- L( R8 T3 \. u: |
     // 将ZipEntry加到zos中,再写入实际的文件内容$ t& i% \1 v1 c: N1 V& Z9 o
     zos.putNextEntry(ze);
! o5 c  e& d3 q/ b8 w, ~     InputStream is = new BufferedInputStream(new FileInputStream(f));; q& {# g' `5 C( e2 ~
     while ((readLen = is.read(buf, 0, 1024)) != -1) {
; |6 C# h' G# `      zos.write(buf, 0, readLen);; y% p. o* D! R; H$ B
     }
9 S1 d  Z# j  N1 \  M, d     is.close();
; d# z: {4 _+ ~7 F     System.out.println("done...");# b. E/ E7 G; p5 z' ^1 Q2 i  P
    }
- I$ p# p* f  b) T; H    zos.close();2 l+ O6 w2 g8 |" S; d1 o" ^
    return true;
7 G3 l& D( E1 h6 m   } else {
2 c  J5 L5 J4 V+ U# R  z! [, c, J    throw new Exception("this folder isnot exist!");
+ V- ~+ M% D* u  k   }
, h0 y0 b+ O4 @2 U: c3 {$ v1 i$ b}
" R# i& y, B6 x+ v0 m  v/**
, @4 g0 X$ D6 b; J* 对某一个文件进行压缩,不允许是目录或包含子目录
+ c2 j/ G3 r- K+ M7 K6 y8 s3 g9 F* . _- h0 _/ A/ [9 U, ]
* @param sourceFileName
3 a5 f$ Q( U$ Y*            被压缩的目标文件,不允许是目录或包含子目录
/ L/ n2 c' ^3 `6 O1 o+ H5 N, X* @param zipFilename
& q9 [* q& _: B+ l8 S  q* b*            为压缩后的文件指定的名称( T5 D9 G3 O/ a! k& i
* @return 压缩文件的大小
) a% k8 ]6 q( K( r) r. v, M* @throws Exception
3 O! Z+ N6 A4 H) Z, x" S7 Q*// E6 w3 J/ h  W% i9 P
public boolean createFileToZip(String sourceFileName, String zipFilename)+ h' \9 d$ [5 j, `( c
    throws Exception {
6 s) f) i! g+ Y/ b/ X   File sourceFile = new File(sourceFileName);9 Z; i1 b6 b1 {# P/ C" ]2 ^/ J
   byte[] buf = new byte[1024];
( P' V$ a% M7 X" s4 l* B   // 压缩文件名" l* X1 Z1 ~- G, [; ^% a9 }
   File objFile = new File(zipFilename);. A( {/ z' J: l. ^; U7 ^* W+ N
   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));6 a+ ~) q+ t$ J+ q
   ZipEntry ze = null;
" x/ U( S' v; b' i+ Z) B9 {2 y5 F   // 创建一个ZipEntry,并设置Name和其它的一些属性
6 z& S# x1 n7 }" Q   ze = new ZipEntry(sourceFile.getName());$ N: f- [) X" e' i% l  s' n8 i. A
   ze.setSize(sourceFile.length());
7 x. s5 D# _% S6 v( q# R. |. l, X. a   ze.setTime(sourceFile.lastModified());9 j! W( V  M. l6 c8 R+ N, S
   // 将ZipEntry加到zos中,再写入实际的文件内容; a2 G: Y% {* }( Q
   zos.putNextEntry(ze);0 M3 h: ]) R/ S4 d: ?9 f0 H
   InputStream is = new BufferedInputStream(+ d( M/ k2 e% G+ U( }
     new FileInputStream(sourceFile));
: j# j" J1 p% ]   int readLen = -1;
6 A2 n9 c2 b' s+ M) M( I. G   while ((readLen = is.read(buf, 0, 1024)) != -1) {
5 i: b2 K" U5 d/ B* s    zos.write(buf, 0, readLen);
3 F" \4 f: R1 r. g9 V3 W   }0 |9 K0 s  `5 f! ?
   is.close();8 j4 A, d* N6 d
   zos.close();
( c0 G: l' h$ @( Z3 d1 {   return true;: k5 _. @0 U' W' L* S' t9 Z! [$ E
}3 y7 h- n3 m( v+ D
/**" p5 \# e# R" X; X$ ^
* 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.
  o, G. G, q* {! e& k. p4 H*
. I- r; W8 Y; s) V* @param sourceZip, O6 G$ E" x' _- O, D( \
*            待解压的zip文件
3 M- v2 P% g& X5 k) c: P* @param outFileName, L" G9 H; s  t+ b7 O' f  I
* @throws IOException
) r+ V+ n* D4 `0 ^+ e+ {* N+ Z*/
# [% u; a/ t: dpublic boolean releaseZipToFile(String sourceZip, String outFileName)- Z4 J: R" ]  P6 n
    throws IOException {& o# t& |5 i% v) t( T0 j
   ZipFile zfile = new ZipFile(sourceZip);
% Z+ A" q- B+ X2 [. {$ D: Y   File fileOut=new File(outFileName);3 X$ K! p* F' a9 s9 q2 Z

* y2 ~) P  a5 S9 F: s   System.out.println("待解压的文件是: " + zfile.getName());
! J2 R9 e  K4 o9 ~: a- A   Enumeration zList = zfile.entries();
6 P- e: t- S; u5 e7 L% s   ZipEntry ze = null;6 O# w- Z7 Q7 e0 T1 y
   byte[] buf = new byte[1024];# l% {. ^1 a: v% D
   while (zList.hasMoreElements()) {
: F. z( h; Q4 G& L    // 从ZipFile中得到一个ZipEntry' A( A: c! t0 C% g# O3 \1 a' c* u
    ze = (ZipEntry) zList.nextElement();' b4 \3 Y2 o% |- e
    if (ze.isDirectory()) {
- f, }- \0 t/ u; o' q, [8 ]; d     continue;8 n) g- p5 A# s
    }0 v6 w7 X0 `' @! j. U4 e! E
    // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
+ P0 f9 N( H% d4 b7 k# I- {1 k    InputStream is = new BufferedInputStream(zfile.getInputStream(ze));& Z# E. j4 W1 y1 }5 {9 G
    OutputStream os = new BufferedOutputStream(new FileOutputStream(% x6 l" R2 L) ~/ b- O- f
      getRealFileName(outFileName, ze.getName())));
8 |" K+ U$ V2 [, D, L* L7 ]    int readLen = 0;" d" R+ T' k+ _( |
    while ((readLen = is.read(buf, 0, 1024)) != -1) {7 w. U( _& n6 ^& \3 A+ E% P
     os.write(buf, 0, readLen);6 q! j9 O9 p8 U/ q
    }
, u4 C( y' S8 x/ E9 K. U    is.close();2 D" }5 W5 W* V9 {5 u2 O1 e
    os.close();
( g5 Z# n3 b6 @. ^; X" K! _    System.out.println("Extracted: " + ze.getName());5 j8 @; O0 O- n  E# K, N
   }
6 [$ ]' w7 [- k0 ^   zfile.close();
* {. K9 f* {6 N6 `1 K+ P- b   return true;' ^9 d% N- C2 ]& z
}8 e  ^" }# `9 l: \! d& t
/**" k* r$ l. Q; @
* 取得指定目录以及其各级子目录下的所有文件的列表,注意,返回的列表中不含目录.8 W. U0 h6 ]& l- ~8 Y3 }# O' P3 `
*
0 n; }# b, `+ r* @param baseDir
7 g" t* F% w, x' {$ F2 j( R8 f0 V+ ?*            File 指定的目录# z% d1 A& I. @9 o0 B
* @return 包含java.io.File的List
$ a" P/ i5 i8 \( Z  y! I4 K*/6 j4 @7 ]! N' c' p2 y0 q6 E
private List getSubFiles(File baseDir) {
9 F+ O6 t  |( X. `0 p   List fileList = new ArrayList();
& J# {# u: M; I8 u. D   File[] tmp = baseDir.listFiles();
. Q0 {2 s8 D3 |; U4 `+ a   for (int i = 0; i < tmp.length; i++) {% x+ s2 c" |; T) A& E+ h* E  K9 k( {
    // 如果是文件,直接加入fileList
# m6 B! f! J9 K. O9 L( p' U/ ~, ~    if (tmp[i].isFile()) {
4 n& |& a; w6 a     fileList.add(tmp[i]);3 Z$ L9 F( F/ ^$ D5 X( A
    }
& g: Z7 c4 Z. K$ }2 |$ `/ ~    // 如果是目录,递归调用本方法,并将结果集加入fileList
/ \5 M- p* x/ ]* B/ m$ `    if (tmp[i].isDirectory()) {: K6 A( J& p) ~8 F
     fileList.addAll(getSubFiles(tmp[i]));) I6 P+ V; R; ~- b, [% B  h* s
    }2 C* v! f, q- X  ?. e: I+ ]+ s
   }
2 A' z" u' n. y- \   return fileList;/ e$ P' a& y0 B# ^% Z
}
: o7 E7 E# U: i- M! Q1 e/**
. p& F. i" J0 g/ [$ w  W* 给定根目录,返回一个相对路径所对应的实际文件名.
2 V! ^- F' X( L$ P* L*
2 A- d8 [, z# @, f" A1 ?8 b& ~8 `  z* @param baseDir
7 j; Y3 {, C, ?2 O*            指定根目录' ^/ s2 @: \% O! e
* @param absFileName0 f" v, b8 ~1 ^% e/ @7 Z% l
*            相对路径名,来自于ZipEntry中的name  X2 O3 D; X; \
* @return java.io.File 实际的文件
2 f* B; B& k! e6 o! R' j*/( t$ o' Q) H# _9 V' {+ T# `
private File getRealFileName(String baseDir, String absFileName) {+ d* W9 h- f- U
   String[] dirs = absFileName.split("/");: y' B+ s5 `9 A0 U. c
   File ret = new File(baseDir);
* Z  c' k9 a, Q% S1 r0 K   // 创建目录结构
8 P, p/ _# j( w2 W   if (dirs.length > 1) {/ |* `) T# e7 c/ \2 V
    for (int i = 0; i < dirs.length - 1; i++) {
- t/ y7 A6 ?$ X5 p% g$ z7 J     ret = new File(ret, dirs[i]);
- f; h1 t! U3 K. @, w    }
- |5 [( w- t% k0 e0 f* w   }7 A  b) W( j. e9 }0 C
   if (!ret.exists()) {. M9 Z, b" a7 K; W; t! \2 H8 A
    ret.mkdirs();
, s1 K, N) p: B! u   }
: o/ S$ i6 c: D# y   ret = new File(ret, dirs[dirs.length - 1]);; d! e' M9 Z, Y2 _" |& K
   return ret;
0 q2 C7 L9 T6 A! X4 c: g& Q}
7 t- ]& u5 N) k; M/**
" b7 O7 O$ M. g2 A5 C. S7 Y" E* 给定根目录及文件的实际路径,返回带有相对路径的文件名,用于zip文件中的路径.. x: G; S7 n  I) Y2 d" X3 H( M
* 如将绝对路径,baseDir\dir1\dir2\file.txt改成 dir1/dir2/file.txt
/ V0 Q3 _- C6 D- N4 G2 l. J" S* ~& f* 2 i' c% `+ J! q3 T
* @param baseDir
$ O) O0 c1 G6 r+ z*            java.lang.String 根目录
5 Y2 W6 ]5 Q. u. G& }* @param realFileName
; A$ V+ L$ F8 c! T*            java.io.File 实际的文件名4 v2 N" F! S0 A# @) y6 S  m3 p
* @return 相对文件名
( Q# @6 }3 q) D7 h7 Z2 n& O: Z*/
3 A; P( ?. F$ o9 o/ o; vprivate String getAbsFileName(String baseDir, File realFileName) {
' L, e0 Z; D$ B, u& e   File real = realFileName;) R; t1 y) r5 U  R
   File base = new File(baseDir);
5 t0 I7 j) s4 {5 ~# G! m   String ret = real.getName();$ G6 u7 E3 Y% m. ^2 v) _
   while (true) {& J9 y* X; s" |
    real = real.getParentFile();  X" i& z9 `  f3 D1 r
    if (real == null)
: H% m: }+ a+ P7 U# Q     break;  M( f0 c8 A" p/ ]
    if (real.equals(base))
& ?8 H$ t4 B: ~, f     break;
7 m1 ^  V% n, h, _+ N6 z! c, f    else {
2 d+ S: @& O2 [+ M6 ?* z5 S     ret = real.getName() + "/" + ret;$ ~4 b$ \) z5 w; ^( t2 W4 `7 j
    }
$ y( m- {0 Y2 U! Q) T1 _: ^2 U: q   }$ r% ]3 G: {# [) M4 O2 p
   return ret;) ^. m: [' m# l5 Q
}" ~" h! ^+ ~4 a, f" A
public static void main(String args[]) {+ W$ p0 i5 R+ b  R
   ZipManager manager = new ZipManager();
- _  i0 R( ?3 w, y   try {
/ J+ g. r2 P# G6 s4 R; Z  Y    manager.createZip("D:\\yy", "D:\\ss.zip");6 `: ^) o* n: Q; a3 G4 P  r5 N
           manager.releaseZipToFile("D:\\ss.zip", "D:\\ss");$ \3 a) g1 F7 l: i! z, A& x, ~/ |
   // manager.createZip("d:\\temp\\zipout", "d:\\ss//.zip");$ f9 _2 Y1 b1 f0 b9 Y5 ?  y9 J5 k8 m
   } catch (Exception e) {. B! p8 c: o* S6 D
    e.printStackTrace();" b2 I* H1 n' M( l! u% a  |' F8 p
   }
7 L" R. q4 H; X5 B' h   System.out.println("over");$ c# T" W% r) Y5 R8 |9 v( v/ p: Y+ c
}% i9 j4 I! t  n* R
}+ [' g) }! `1 N! w% z

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

GMT+8, 2018-1-17 13:25

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部