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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 936|回复: 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;
, W/ t: y, o* y) X" m. L% B8 m
5 p% ]9 L, F# Q. a
8 Y% M7 i! K8 q2 @0 pimport java.io.BufferedInputStream;
9 Y' V. X9 _8 B7 e" G) Iimport java.io.BufferedOutputStream;# N7 g# ?3 d( T" N1 D; A' p2 k. X4 O
import java.io.File;
  ^8 x/ J" \4 F6 G. S! iimport java.io.FileInputStream;
  Z% O1 R; y& v) F. [& m8 Eimport java.io.FileOutputStream;6 B9 b+ G6 u' J1 j
import java.io.IOException;9 O$ |( C2 A* _+ f8 N9 \# r9 `% w
import java.io.InputStream;4 [7 W4 k! H( a% Z0 `2 J( d
import java.io.OutputStream;
, R# F( L! R/ S! ]9 Timport java.util.ArrayList;
& {5 {8 {: w) y* f9 a9 Timport java.util.Enumeration;
; N) N' i9 f: j) ~import java.util.List;! ^1 I- @1 B8 D5 \0 L$ K3 K
import java.util.zip.ZipEntry;
' I% X0 J# H  o0 `* H3 bimport java.util.zip.ZipFile;
9 K+ q% d0 P# N, s$ Timport java.util.zip.ZipOutputStream;
1 f8 A/ {, E9 j2 E/**
' o7 G2 \  s& g9 D! f! M! u/ G  p* 此类用于测试JAVA的ZIP压缩及解压5 [  J$ ?& c0 F" \: A9 M: u1 a
* 4 o1 e; \0 |# @) Z; W
* @author Sunny Lee (2008-1-4)
0 v1 ^: U' C( ^+ U% y* n* @version 1.0$ {/ V3 p! {5 \* l
*/$ q. G% D6 x" R3 K% n
public class ZipManager {
" x0 i9 a8 {. H; I# v: a/**
1 |7 i# x. Y. @0 [* K! }2 T* zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
8 B) v" E3 K4 ~: {- K& d* 此方法可保留被压缩文件的目录结构
+ W5 A0 i2 a& R0 K/ `*
6 O7 s' q. V, G- B4 J9 ^* @param baseDir1 }0 M3 _' z, L2 A* T8 a2 p
*            所要压缩的目录名(包含绝对路径)8 P5 m8 ?. V# e: |. u" B$ a
* @param objFileName
; a, W$ T/ O% {. L. B- P*            压缩后的文件名
, k( A+ E$ p  C* @throws Exception
' j& K7 v) h4 `: M: O( M*/
2 L8 P5 U9 P) b( hpublic boolean createZip(String baseDir, String objFileName) throws Exception {
+ W2 `- `% ^6 |* I- i5 E   File folderObject = new File(baseDir);
& _% `. X2 t6 V9 M7 R   if (folderObject.exists()) {; F- N- b5 ?3 Z# n) @
    List fileList = getSubFiles(new File(baseDir));
5 W4 A* ]3 a) ^2 x% ~. q  }. u
9 \& R7 V; v# N: Q- R6 N5 `6 I    // 压缩文件名- y( Q' N% ~8 H/ S
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(0 O" B5 x: s) g1 F! W
      objFileName));
3 G" b1 R: S) j8 Y0 @1 n    ZipEntry ze = null;0 `  m: K- [  v- C6 ?
    byte[] buf = new byte[1024];7 x& T/ h$ y  @5 U1 @/ p
    int readLen = 0;
0 M5 z: b6 g' a* k, G    ze = new ZipEntry(getAbsFileName(baseDir,folderObject));5 c; C+ J0 X0 B5 K: Y4 y9 p
    zos.putNextEntry(ze);* V( a3 D- Y1 m: J- z/ A3 w+ ^6 b
    for (int i = 0; i < fileList.size(); i++) {; G) Z5 c4 @* X$ w/ }0 x
     File f = (File) fileList.get(i);
& f4 N6 X0 I: i& o5 p     System.out.println("Adding: " + f.getPath() + f.getName());3 I  n1 M  V, l+ T
     /*7 W7 x& o1 ~% b# p$ P  {& V
     * 创建一个ZipEntry,并设置Name和其它的一些属性
! S) L8 R+ J- F# h0 N     * 注意,该ZipEntry是包含目录结构的,此功能是由getAbsFileName(String,string)完成的! e& S8 }4 f1 V; q: M
     */8 w; H9 W0 w( j
     ze = new ZipEntry(getAbsFileName(baseDir, f));
) U; d; y. w! N6 y1 y3 t     ze.setSize(f.length());
; N2 d2 }1 C6 ?     ze.setTime(f.lastModified());. l2 {0 D' F( x& k% |/ h; Z, H
     // 将ZipEntry加到zos中,再写入实际的文件内容! M) z0 d( I+ V9 b# g( L
     zos.putNextEntry(ze);
/ S1 S5 h; f$ `  J$ K: G9 O" q     InputStream is = new BufferedInputStream(new FileInputStream(f));. A. B3 p8 J, p1 |5 g/ m
     while ((readLen = is.read(buf, 0, 1024)) != -1) {
6 R6 i& o% O1 o0 [; w# J      zos.write(buf, 0, readLen);
& ]7 T6 p, p$ E! x     }9 n* S6 n; _( j
     is.close();: Z  M. b9 i$ d' _" ^" {  g
     System.out.println("done...");
* f4 q" ~, S6 X; z4 J4 W    }
- S0 c9 R% f7 k0 ^2 r" t0 w" S' w    zos.close();2 y- X1 m2 l3 R
    return true;
" `" M1 [- D# p) [% {, X# N! _# P   } else {, n' T' b- I5 u7 t: W+ q! V
    throw new Exception("this folder isnot exist!");& `9 k  c) p+ Q: X
   }9 M2 X9 H' K. F
}
5 h; o! g- I( G0 J+ P; n: a/**
8 v. B+ V7 f  m" {. Z* 对某一个文件进行压缩,不允许是目录或包含子目录
2 V: K9 l$ S8 t6 s4 R+ l*
( v5 X1 P7 T& Y$ y* @param sourceFileName) w2 d6 h7 q# E0 v
*            被压缩的目标文件,不允许是目录或包含子目录
/ e8 b! d7 W1 L! f! z+ P* @param zipFilename
) w8 Z3 W0 [% i2 ~3 g*            为压缩后的文件指定的名称
  h/ v/ Z  z  _" Y* @return 压缩文件的大小* y7 g+ t$ |0 d
* @throws Exception1 Y8 |) ], h# {, w& T2 k# E
*/
% k7 j, }( `" Rpublic boolean createFileToZip(String sourceFileName, String zipFilename)/ {1 m+ }+ {. U( ]
    throws Exception {* h- F( S; W5 o  x* A7 k
   File sourceFile = new File(sourceFileName);
) {0 N" n& V: G  d9 X8 ?0 r. u   byte[] buf = new byte[1024];, N  |0 j; e! X3 b% M
   // 压缩文件名
' c2 h4 G8 Q* [: U. _   File objFile = new File(zipFilename);
! @% Z8 o/ J4 `5 }7 v   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));" ]  v. p3 N6 I; m
   ZipEntry ze = null;
* V8 B1 I% k& j# I+ C1 N   // 创建一个ZipEntry,并设置Name和其它的一些属性1 \( B4 d2 q( z( R0 A' }
   ze = new ZipEntry(sourceFile.getName());
: s6 F/ L, J: i, `   ze.setSize(sourceFile.length());4 T: z* R8 z& A+ W) U2 F7 Z! u
   ze.setTime(sourceFile.lastModified());
8 |0 O8 d. H! g2 c5 ^   // 将ZipEntry加到zos中,再写入实际的文件内容
5 W# j& V* u. ?/ J& M! z" Y% d   zos.putNextEntry(ze);. P" S1 A2 v. B& P3 g" V
   InputStream is = new BufferedInputStream(1 s; F% k% E% H/ c8 ?' b! `
     new FileInputStream(sourceFile));6 p4 Z6 g% L' {" M- \& M
   int readLen = -1;
& X5 [' A. e$ u" ~5 s   while ((readLen = is.read(buf, 0, 1024)) != -1) {9 ~0 v2 I1 |) u7 E
    zos.write(buf, 0, readLen);
, |  e( r- n1 x" w7 b$ i9 S  @( U9 A% e   }
2 l8 N9 J0 X" K# @! I) d   is.close();! w' H% P* X5 `, c- J: Y, |
   zos.close();8 p! e3 U/ o& y0 L5 s; [
   return true;8 J0 p0 Q. F+ |- w
}
" x% P1 e/ q( M" K! V, c* o+ [8 U/**
/ |/ E; e( `! g7 T; ^0 a1 e* 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.$ ^5 {2 x3 l9 o3 q3 ]
* + }- z, }1 [* D6 a! V8 |# B
* @param sourceZip
# U8 g9 A( F; Q! w4 V0 R2 B( F*            待解压的zip文件
# E# o# d/ w# L  I& c* @param outFileName/ T9 m$ I) l/ }$ e& @8 t
* @throws IOException' w" e# g: L1 d0 Z+ k+ z2 S
*/
+ K# h' f& @  @; Q1 wpublic boolean releaseZipToFile(String sourceZip, String outFileName); L" o8 z' M/ f  b! `  A% \" e
    throws IOException {% c4 X0 s3 Y0 S) i* A3 ]
   ZipFile zfile = new ZipFile(sourceZip);
  k* b5 @: M( r8 S   File fileOut=new File(outFileName);
, V9 n6 B5 c* f
7 ?# j) H8 D: \   System.out.println("待解压的文件是: " + zfile.getName());
" o! k, Y. s! q5 ?$ O9 G   Enumeration zList = zfile.entries();- d+ ]" B6 {/ z" W4 k
   ZipEntry ze = null;
1 ^2 i# ^. ^+ y. E9 ^& Q3 p& z   byte[] buf = new byte[1024];9 `. R) h/ D# p6 F
   while (zList.hasMoreElements()) {+ s/ x1 E9 y* u
    // 从ZipFile中得到一个ZipEntry
+ M0 `/ o' W8 d/ m; R: d    ze = (ZipEntry) zList.nextElement();8 E: }/ Z8 l# `/ X) F( D
    if (ze.isDirectory()) {
* {4 {; d5 r# r" F) \. u& Z5 k% Y     continue;8 i- M+ ~% I0 y) }
    }; N: Z" P7 }' A8 h0 |" ]7 y: Z
    // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
7 X2 t6 g& j( S* n. i/ ?6 }    InputStream is = new BufferedInputStream(zfile.getInputStream(ze));% A' Q. @3 m( L* f0 H/ J$ L
    OutputStream os = new BufferedOutputStream(new FileOutputStream(
3 a/ F" V; o7 x5 f4 [      getRealFileName(outFileName, ze.getName())));' f# \  v; v. Y' M8 Y3 g. [% X" w
    int readLen = 0;
, I2 x) s! p, S) Z" D0 z    while ((readLen = is.read(buf, 0, 1024)) != -1) {
* `& K" ^& q2 L4 N' G     os.write(buf, 0, readLen);. x- K# l4 t3 P7 Z$ |8 S7 J
    }2 N9 w' C, {/ p' B7 O
    is.close();
1 z% ]2 l1 M! Q' T7 I5 W    os.close();- G0 y. e2 H+ U( s: V
    System.out.println("Extracted: " + ze.getName());4 ^& s- @( Z6 H
   }/ V5 k& C) @: F% b2 v  _9 [
   zfile.close();
0 ~' J8 j- s# |* f* r' D3 i   return true;- ~$ K* L1 U! K. t  `6 l
}
4 q' `6 E3 v. u/**3 g$ ]0 Z; k" ]( T" d
* 取得指定目录以及其各级子目录下的所有文件的列表,注意,返回的列表中不含目录.2 c% C+ X0 |6 g5 u- s$ C- K8 C5 W* l
* 9 s" L: W  K: U* e7 ~  X  g) t
* @param baseDir" g2 w+ \! [1 E3 ]0 e% J0 H' I
*            File 指定的目录" [, U" ~' _6 B$ n) |
* @return 包含java.io.File的List3 s! B& o( }- a' N
*/9 E. E, y3 P1 K1 j
private List getSubFiles(File baseDir) {
- ~* n" z" ]% Y- i   List fileList = new ArrayList();" G' y, l' S7 J1 b+ W' a' E" q" P1 G
   File[] tmp = baseDir.listFiles();
9 W( |: r" l3 E! ~* s   for (int i = 0; i < tmp.length; i++) {9 p& Y) T6 e* }9 a! j
    // 如果是文件,直接加入fileList2 p. g$ I9 t4 [# W: R4 F, ]0 y0 [
    if (tmp[i].isFile()) {
5 e; d! A2 r5 t2 i; a9 l     fileList.add(tmp[i]);; ^+ O1 U  P5 H; U4 ^; D/ j
    }
1 J/ @$ U3 s* b: N- C# P    // 如果是目录,递归调用本方法,并将结果集加入fileList
* y& u# {6 \% Y4 K4 T' w; }    if (tmp[i].isDirectory()) {
* m. f5 C* ~. j/ Q- h3 o. V     fileList.addAll(getSubFiles(tmp[i]));$ V/ h3 M( i  ]0 U
    }( Y. Y4 o4 n- {6 ~0 }; z+ j. L
   }  }* h: V( {) h1 F' A* B+ V
   return fileList;2 [7 i. O4 Z6 j  m1 t. s
}
7 X( l4 ~" _' h, ^6 B* l6 f/**7 C2 M1 q/ T; C+ }6 R0 b" {
* 给定根目录,返回一个相对路径所对应的实际文件名.
2 x4 B: `; G5 |*
8 B7 P% C( x2 v! o  x% B* @param baseDir
0 j/ J+ x; c0 p: Z*            指定根目录- }7 X3 V9 t, a
* @param absFileName0 P* j* [+ E$ W  S
*            相对路径名,来自于ZipEntry中的name: @% |: m4 |( y( i
* @return java.io.File 实际的文件  `7 C! N0 Z3 Z! j
*/
$ o! L) P3 k, U/ j2 p4 [1 }2 Iprivate File getRealFileName(String baseDir, String absFileName) {1 Y! }2 o8 E! C; X
   String[] dirs = absFileName.split("/");
9 E( t# I+ i5 ^   File ret = new File(baseDir);( m: F! O( @6 B1 L
   // 创建目录结构
3 i) s5 y* _  L* x: x4 f: C4 u   if (dirs.length > 1) {
# W0 q/ S8 L0 a5 F/ `    for (int i = 0; i < dirs.length - 1; i++) {
0 Q) F* K; V; w6 N6 c& @4 O5 }     ret = new File(ret, dirs[i]);
# r9 c1 N+ W* g4 X, U' k    }7 Z2 R; h. c7 C* A
   }% W9 @9 C$ s( M% v
   if (!ret.exists()) {
6 z; X, _" Z9 y" A+ o1 d- X0 z    ret.mkdirs();& H( n: _' S5 l+ P" |
   }
2 H  D6 Y: k  L1 U1 k5 ]. H: W   ret = new File(ret, dirs[dirs.length - 1]);% y. j" n6 \/ [
   return ret;
. c; I7 G' t& C9 }* x) j) b0 S}
5 D4 N) U4 M- s8 _% N/**
6 R1 ^) H% P4 t( ^7 H0 b5 v8 {* 给定根目录及文件的实际路径,返回带有相对路径的文件名,用于zip文件中的路径.4 g' ^" Y! B, }2 Q1 ^) m$ p
* 如将绝对路径,baseDir\dir1\dir2\file.txt改成 dir1/dir2/file.txt0 q1 x0 o) `5 {3 l  P/ z$ o
* / `4 u8 q" }0 F4 u5 Y
* @param baseDir+ H4 ?; @3 W5 E" ?/ y
*            java.lang.String 根目录/ z9 Y& u% K: I8 m' _$ B# ?4 f! t
* @param realFileName
; C$ X% j) e3 V( u2 k*            java.io.File 实际的文件名
3 n3 h9 |( S/ v* _9 B* @return 相对文件名( @% t" f  o$ c, J5 X% Z3 U
*/1 R; p# d$ g6 f, ]
private String getAbsFileName(String baseDir, File realFileName) {
9 z0 y9 z3 B# b3 s- H6 O1 A" B   File real = realFileName;( v& u( `% o8 ^5 S# S7 U1 {- d! z
   File base = new File(baseDir);( x) @* x. ?* h
   String ret = real.getName();
7 r' O! s+ _8 S3 S3 |: v   while (true) {
3 P8 z5 Y: ]0 t$ K5 T7 \$ L: U7 W& M    real = real.getParentFile();9 g4 m4 f. J5 ]2 _
    if (real == null)
6 D: o9 j: p# X7 }" y; z     break;
! z$ r6 ]) _: p4 G    if (real.equals(base))
  K6 o( ?+ G$ {" Y     break;
) h$ s, w- z" T, M    else {
- s" s% P- b: z" H# P$ f& N     ret = real.getName() + "/" + ret;3 k5 d" ~! C- z) g4 U& ~; ^
    }
! v- c7 L6 i, ^5 i8 i   }) V% P( K, p/ H+ W0 c- |
   return ret;1 \$ W: W; R8 Q. \: v
}( D" Z. o( @3 O, I
public static void main(String args[]) {4 U; K# ]0 d2 a- X4 X' D2 B1 h" c
   ZipManager manager = new ZipManager();
( \5 i# `- e. S8 I   try {. O0 g% w! \) M# o# X2 Q
    manager.createZip("D:\\yy", "D:\\ss.zip");
/ ?' w( v- n3 h/ T' ^9 v) d% U& d           manager.releaseZipToFile("D:\\ss.zip", "D:\\ss");$ n! n# d' L; d. T0 u. r. a
   // manager.createZip("d:\\temp\\zipout", "d:\\ss//.zip");. V' J0 p4 j# x0 z0 a& j
   } catch (Exception e) {6 D# s8 S2 N" I& H9 X9 j
    e.printStackTrace();* A' q$ Q+ V; B. V3 I
   }
$ y8 k# m/ ]! g   System.out.println("over");
% b8 I- r" B0 B2 A. |) C3 Q}
6 L, F' b9 y8 N: F) g0 N+ _: R! r, D}
" A5 w3 j" i. o  l$ n

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

GMT+8, 2018-6-23 02:37

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部