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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 1104|回复: 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;
, N6 }3 G1 n! m) v+ t8 t- C  z0 |- A8 i! f4 o% a

" D% U- ~- `* ^1 x7 R3 Mimport java.io.BufferedInputStream;
- }0 E0 S+ b$ G3 n3 }import java.io.BufferedOutputStream;
: }. G1 L* S, {! s! S' ?import java.io.File;
1 a8 _% a- ]2 N& V( ?( y" U' a+ c9 rimport java.io.FileInputStream;/ `  _* |! _* S8 l# `; Q
import java.io.FileOutputStream;- ?7 o- }: s+ b: Q9 h5 B1 s
import java.io.IOException;
1 i9 R9 G; L( P. J* p/ c2 Pimport java.io.InputStream;
- Y9 m- E/ j$ E  [/ \import java.io.OutputStream;
8 L1 Z. s9 n3 a& I0 Zimport java.util.ArrayList;8 Y$ m1 `5 r, B8 l$ {& j
import java.util.Enumeration;. s6 C7 z' H5 H! k! U) x
import java.util.List;
3 m) j9 K) ~9 S6 ?import java.util.zip.ZipEntry;
. N8 J  ]8 q* G, r9 fimport java.util.zip.ZipFile;
4 `! ~; o9 Q& Fimport java.util.zip.ZipOutputStream;2 B3 |+ U3 A- T
/**
+ z9 A( T& B9 ~* 此类用于测试JAVA的ZIP压缩及解压9 E- b" d# J4 J
* 7 i: @: B1 l, G$ f+ ?: d5 o6 w8 T
* @author Sunny Lee (2008-1-4)
, ]1 j/ }! l& v2 T- _8 P+ i) ?* @version 1.0* S, c# Z" p8 ~5 V
*/  i2 M* q) r$ W( _7 z
public class ZipManager {
' |$ ]6 r+ b1 q) \1 f1 ~+ u/**' U: r- j( B( k- D" S
* zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.3 e) Y* A5 C* f6 \% b0 F2 Z- e! {2 S# o
* 此方法可保留被压缩文件的目录结构0 b' ^6 _3 ^1 D' m
* : }0 p0 ^! d" n  X  q8 W8 m1 i
* @param baseDir
3 ^& x% n' u. }: K9 [*            所要压缩的目录名(包含绝对路径)
: _. j( t8 G, u% P* @param objFileName  ?! F* @& ?. u+ \% O8 u- d6 J
*            压缩后的文件名. ]3 A( T1 ?0 r: D; j. `" O! O. |
* @throws Exception: i9 a& B7 Z6 e/ G
*/
4 o6 R$ F: z: x' qpublic boolean createZip(String baseDir, String objFileName) throws Exception {
1 J( p5 r  k4 k: Z; x, u% G( r$ f8 E- u   File folderObject = new File(baseDir);/ H& j" _  n+ S- S( q/ ?% a
   if (folderObject.exists()) {
- f# L+ M. N8 @6 ]) g3 j    List fileList = getSubFiles(new File(baseDir));* ~2 G/ l4 v5 m) t9 v! m/ c

+ N% F0 }; o' q! B4 d7 W    // 压缩文件名
  ]8 F9 L3 W: T) h! L8 {    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(6 T2 u' }$ e. i) L
      objFileName));
/ u, ^$ k6 }. R( s9 G2 i$ l    ZipEntry ze = null;
2 q8 P  S/ M  q  }# |    byte[] buf = new byte[1024];4 K7 w( V+ v/ r0 e% a1 P, l
    int readLen = 0;
4 ~# m" i8 e. h2 L) ^" @    ze = new ZipEntry(getAbsFileName(baseDir,folderObject));
# D; A' d5 T5 v# q    zos.putNextEntry(ze);
) M. I/ Z" }: G$ J# v    for (int i = 0; i < fileList.size(); i++) {
  Z- M! c& g. Q, M- C! F6 T/ @" k- I( j     File f = (File) fileList.get(i);
8 V6 G0 J) K$ \: k     System.out.println("Adding: " + f.getPath() + f.getName());0 ~2 q5 m+ z% z" W% q9 U8 H* q
     /*7 b/ q2 p! I1 R
     * 创建一个ZipEntry,并设置Name和其它的一些属性
6 I4 {; u# G" K5 `     * 注意,该ZipEntry是包含目录结构的,此功能是由getAbsFileName(String,string)完成的( b# o& {6 K3 z! i9 C
     */* L- W  s$ K  E% g) n
     ze = new ZipEntry(getAbsFileName(baseDir, f));
0 \2 z8 T; s3 @- G, q  M4 ~+ W) |: e     ze.setSize(f.length());
! v4 J2 O% t7 n9 p! r# V     ze.setTime(f.lastModified());
. |& ~3 M- z( k. @; j     // 将ZipEntry加到zos中,再写入实际的文件内容
% g# s% ^* i9 E  L% `* Z     zos.putNextEntry(ze);2 \3 d$ w! f! Y+ N- _; M. }
     InputStream is = new BufferedInputStream(new FileInputStream(f));: @1 g4 A# ~3 E9 L# C+ I& ^' ?
     while ((readLen = is.read(buf, 0, 1024)) != -1) {
  W$ ?8 V, V" \4 h      zos.write(buf, 0, readLen);4 V% O& @% L. [- q/ Y4 V$ O
     }
3 z5 E# M7 q6 U  v0 x     is.close();
% H8 X5 |! X1 d, {8 s/ N+ z     System.out.println("done...");
" K2 }( }) l* E) ^    }
4 d9 b, y3 }0 K. v7 Y    zos.close();
! k  K' m0 }- `1 |+ {    return true;6 d' m3 f) o, h4 j) [& E
   } else {5 l$ ^# ^  s. ~3 T* H" W+ e6 X
    throw new Exception("this folder isnot exist!");
- q1 B3 H, ]+ i1 K   }! `; q; B7 ]9 L
}2 a# `* f8 {! I. `7 J& r3 f
/**
& M/ h$ a+ b* m3 }- N( ]" C* 对某一个文件进行压缩,不允许是目录或包含子目录5 T& ]) |$ p1 {
*
5 l3 q, K. u( ~# q9 m5 m& ]* @param sourceFileName9 V3 A  U: I+ U0 G( H4 R
*            被压缩的目标文件,不允许是目录或包含子目录" D+ ^2 N7 }/ m# v7 I! |) z
* @param zipFilename
$ H* d5 q0 A  J) X. U9 ?" m*            为压缩后的文件指定的名称6 k, B6 r2 E' g  n+ l6 D
* @return 压缩文件的大小( ]  U% j6 S5 h# N
* @throws Exception0 v0 z5 X1 L3 S/ p- O. V) D) l# `5 V
*/! B- m! I3 M* y/ @
public boolean createFileToZip(String sourceFileName, String zipFilename)
) S0 ^- U  N& n9 {    throws Exception {
7 h' x$ K6 S% [  H1 r   File sourceFile = new File(sourceFileName);
( N7 c( ^+ k0 D& c3 B0 d   byte[] buf = new byte[1024];
' W8 V) p- v- D+ ~1 j" Q: @! V   // 压缩文件名
0 x: e* r6 b1 S: B   File objFile = new File(zipFilename);3 r1 `; X8 B' o9 y* r9 J" S
   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));
% z/ T6 H3 g5 W, `/ M( g   ZipEntry ze = null;
& B, T# K. X" g; J. `$ i0 m! V   // 创建一个ZipEntry,并设置Name和其它的一些属性& `: X" @/ S# Q: q9 q' u
   ze = new ZipEntry(sourceFile.getName());
' i# p: h- v. \2 O/ g, `   ze.setSize(sourceFile.length());- }- l5 H+ _1 [- _3 V& ?+ X
   ze.setTime(sourceFile.lastModified());( z, a9 E/ b- u6 l6 |* v
   // 将ZipEntry加到zos中,再写入实际的文件内容
9 ~! K6 I7 Y$ j* u4 ?   zos.putNextEntry(ze);$ E- Z7 m, F3 B- Q" ^! J
   InputStream is = new BufferedInputStream(
2 ]# F" ]4 s0 ?' u% ]     new FileInputStream(sourceFile));
! ~  V* k. g- r, c) e  Q  J   int readLen = -1;
- U: {  X6 ?  q9 w( J7 j   while ((readLen = is.read(buf, 0, 1024)) != -1) {+ o& I& `! K( d0 Y
    zos.write(buf, 0, readLen);7 `1 d8 I+ b8 c
   }
0 w: g& i- y' \* [   is.close();5 b2 t# D& \& k8 X/ k
   zos.close();8 T+ a$ u$ \3 m9 p; @7 i
   return true;' f% @, O+ V; K: l, _7 m
}
- q7 E. _' F# H7 H' }/**
# a7 q! L, t) W& f2 K9 L9 Q; w( m* 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下./ w# ~9 t5 r6 L+ K. v7 m! w
* 6 J6 O5 s" w- P
* @param sourceZip! x6 I; r- Z) w; e  C$ R
*            待解压的zip文件
4 \# r( z  y8 e* C* @param outFileName5 ?  h  }! Y! ?+ L) G3 ~
* @throws IOException
5 z- L* w7 v' U) v6 _*/
/ E3 o" U  B' {9 Hpublic boolean releaseZipToFile(String sourceZip, String outFileName)( ~% j7 ?+ C9 n  q# y, R
    throws IOException {
: \1 g2 b2 y; K% e- J3 U' s  x   ZipFile zfile = new ZipFile(sourceZip);
9 y# V" B) n' I7 C. C; I8 m   File fileOut=new File(outFileName);
; h+ b* x& }9 Q, S- l( c5 }
, g/ K0 w* t( j  j* Y   System.out.println("待解压的文件是: " + zfile.getName());0 D/ w( k; K9 q6 w
   Enumeration zList = zfile.entries();0 |( J' k6 _# o4 v; W
   ZipEntry ze = null;
5 h3 @( m3 h, ~   byte[] buf = new byte[1024];
; v, G8 H+ v8 j+ o0 H   while (zList.hasMoreElements()) {7 X) R, _! D8 e4 x8 s
    // 从ZipFile中得到一个ZipEntry
- N9 n2 {4 \/ j  P& p1 r    ze = (ZipEntry) zList.nextElement();1 c+ O( P$ y1 u; L. q% u
    if (ze.isDirectory()) {+ m* Z* `5 B9 f+ |: U! ~- C
     continue;
5 W" Q& n3 g: L4 ]    }
% P8 j+ X7 ]7 n" Y+ j6 J    // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中* a6 u$ e* m  W2 s8 s2 ]
    InputStream is = new BufferedInputStream(zfile.getInputStream(ze));( z! U7 m, Z7 q8 D/ S
    OutputStream os = new BufferedOutputStream(new FileOutputStream() k9 d. D9 c0 o- Y
      getRealFileName(outFileName, ze.getName())));
- H0 s( i& C& N" w6 U    int readLen = 0;
/ N2 P" @, }" C- @4 _    while ((readLen = is.read(buf, 0, 1024)) != -1) {- c0 h$ `8 s! k3 [5 ~  U$ \
     os.write(buf, 0, readLen);
7 `4 z8 ]5 I/ d$ e/ A: @3 ?8 S    }
! _  ]+ S7 u8 Z( s- g) v9 a    is.close();1 b2 A$ r) g9 V& j$ i2 f8 o
    os.close();
2 y( `) S* ?) t    System.out.println("Extracted: " + ze.getName());; @" K" l) D, T
   }
1 D3 }$ b/ N1 G/ V" G# _   zfile.close();
5 c* g& \& ^) `& u2 a9 F1 u   return true;
8 n, \' [. t8 `, `+ q! n  J/ s7 G}
% U5 Q) P) @) y* e% Y% D/**4 v7 Q8 P2 ~" e' s/ D+ F! c7 E9 D
* 取得指定目录以及其各级子目录下的所有文件的列表,注意,返回的列表中不含目录.
' G. g) {0 X( H*
( h- V0 v" b2 f. }+ F3 k" p* @param baseDir- E2 T8 S4 |2 T
*            File 指定的目录+ F7 ]! h8 }) D# a
* @return 包含java.io.File的List1 n4 G4 |: ~7 j* P' S4 q9 B# j
*/9 t& \" P7 q* l1 b/ z1 i
private List getSubFiles(File baseDir) {
, j! `  L6 k' _  M8 k) f; F: d   List fileList = new ArrayList();
8 o) f4 E" D: z- D* D- z* c2 f   File[] tmp = baseDir.listFiles();3 P; [5 Q4 \1 ^2 ~; B( M$ P" k. Q
   for (int i = 0; i < tmp.length; i++) {
2 u  R  T: n3 s3 S    // 如果是文件,直接加入fileList$ W/ q4 k9 e- g) J% @
    if (tmp[i].isFile()) {9 s& ?7 q8 V2 i* ~
     fileList.add(tmp[i]);
5 S; v+ T. D+ Q! [9 h    }9 c4 K/ l& g/ k9 o
    // 如果是目录,递归调用本方法,并将结果集加入fileList* J" f4 U; n, u) z. O: x9 T7 g  x8 p
    if (tmp[i].isDirectory()) {, }$ B+ `7 y6 |2 |
     fileList.addAll(getSubFiles(tmp[i]));% _$ k& B5 d$ T. C) M
    }/ e2 S) T1 |% ^- \& a( u
   }
9 ~6 i# A+ U. ]( S$ h, v   return fileList;
5 Q/ j; `) J# l! q}; F* s6 f1 a$ }1 t' K4 @4 |
/**
9 x# h$ K3 I; x  o: F. H* 给定根目录,返回一个相对路径所对应的实际文件名., s  U5 B- L" v3 K. ~$ x" ]$ D
*
7 F: B8 ]2 I4 E+ ^9 n2 d! n* @param baseDir
  h% o  u5 p8 s& J0 @& a# K9 I5 j*            指定根目录2 [" m8 d  K+ [0 ~
* @param absFileName$ X% q) @4 }$ }7 N' e7 d
*            相对路径名,来自于ZipEntry中的name, U$ ], l: o+ s7 _8 V8 Y1 J8 u
* @return java.io.File 实际的文件
2 F" u; @! @1 Q( b2 H2 [8 [* c4 x*/
7 X5 [9 q" Q: ?( r+ Oprivate File getRealFileName(String baseDir, String absFileName) {, }$ S. L+ m& i) v4 A- l8 x+ J" D" m
   String[] dirs = absFileName.split("/");" U3 P' ?: W7 o5 Q- v8 C. Q) I4 E
   File ret = new File(baseDir);( `7 O, D1 k: V! m1 z5 v. F4 s
   // 创建目录结构6 p1 W9 K% {1 Q% S/ V" j% Y
   if (dirs.length > 1) {3 s  \. s7 ?4 O: s1 t# G4 {' o
    for (int i = 0; i < dirs.length - 1; i++) {4 p; O: J' l/ n
     ret = new File(ret, dirs[i]);6 F0 r2 u' b- E3 E6 p3 g8 I7 ^- ?
    }
' y$ `6 r# z' j) j8 _   }
/ }& C7 j- m" g% N   if (!ret.exists()) {
6 S- |2 F7 g  n2 H& s) x% \: x  I    ret.mkdirs();5 \9 n3 v- f5 s$ n
   }7 C/ a9 r" r6 V0 B8 d" z
   ret = new File(ret, dirs[dirs.length - 1]);9 u! R8 O/ v1 ^) L4 D
   return ret;
- Y3 \/ P. }1 Q9 _}, s3 o& o  F+ V- S) Y: F0 S
/**3 N% o2 O: j7 x1 G: G- J
* 给定根目录及文件的实际路径,返回带有相对路径的文件名,用于zip文件中的路径.
# Q. J1 A7 `* o8 p* 如将绝对路径,baseDir\dir1\dir2\file.txt改成 dir1/dir2/file.txt) i3 C; U  C' w9 I8 B
* 8 N3 o8 q  ?) Y; X8 k
* @param baseDir: a7 X: t/ S) u% V. g2 s( ~
*            java.lang.String 根目录  F) r8 ^; }$ E9 i
* @param realFileName
$ Q( [3 r' N' ~  i5 V5 g! ~*            java.io.File 实际的文件名
. I, }2 M- o. P9 c* @return 相对文件名8 [# H+ c5 `$ L
*/
4 v$ S% \  s8 t* tprivate String getAbsFileName(String baseDir, File realFileName) {3 @" o( P  S) n# f) _* [$ d! y( J
   File real = realFileName;& d3 K( v) _3 W( o3 U: @% ]' N" h
   File base = new File(baseDir);
9 G. }: x7 i2 N/ }: r   String ret = real.getName();: W; U- z5 _% a+ ^
   while (true) {7 W. r0 z7 \5 {2 p
    real = real.getParentFile();1 G! U% S  x( N. r0 ?
    if (real == null)3 J( V- ~3 c! a4 \; M5 L
     break;. z  s( p/ a8 M$ m
    if (real.equals(base)); q9 [  V5 o5 O$ E2 [) _3 @6 i
     break;* U4 ?8 R% b' _3 W5 N+ i0 F
    else {
. h8 S1 L( W. V( e     ret = real.getName() + "/" + ret;
; H$ |4 r1 U" p+ m    }3 r* p0 Z# N* G& a6 t& \
   }9 W" \# l, K; U+ w
   return ret;( w) s8 U5 b3 k/ a$ c
}( E/ H4 k& ^. @5 }( q
public static void main(String args[]) {4 G( {7 Q& `& Q% Y" g/ N
   ZipManager manager = new ZipManager();
( [  ~! O9 h* N$ |+ m& f! V( k9 Y   try {
- o& e; Y" u1 b    manager.createZip("D:\\yy", "D:\\ss.zip");, l; b( D3 Z* I: w- {  s, n/ ]  G
           manager.releaseZipToFile("D:\\ss.zip", "D:\\ss");, g+ D! V* M0 o$ Z
   // manager.createZip("d:\\temp\\zipout", "d:\\ss//.zip");
+ {9 A* n7 O/ G) d: H, R   } catch (Exception e) {
3 f' P& Z6 _6 R    e.printStackTrace();1 |$ c4 w/ x6 ]: t
   }
1 M9 p( X; r/ \$ L3 {( d   System.out.println("over");
9 r! |) @( q9 r5 m0 c+ W( R}* N7 [) o: a. p9 k  M& h
}7 x; `8 i' E2 t+ Q- u4 @% B

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

GMT+8, 2019-5-19 18:37

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部