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

星组游戏论坛

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

QQ登录

只需一步,快速开始

查看: 1044|回复: 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;4 H% [9 g3 H. T# B- @# u% f, t+ ~
& Y2 @/ g, J2 q

: U4 X- \3 u0 f  h5 j3 Ximport java.io.BufferedInputStream;* p' g+ h" I% ~
import java.io.BufferedOutputStream;
- `* t0 w/ u! R% Pimport java.io.File;- K. [- h. R% F- f* S; ]
import java.io.FileInputStream;
% N! l1 k) Q! L1 b$ Z" ]( vimport java.io.FileOutputStream;
! Z' k6 \/ m! L) `import java.io.IOException;
, b' |5 j/ g7 C- _import java.io.InputStream;
. K" e7 _( s! Limport java.io.OutputStream;
2 @5 Y8 ?- C0 l- Y4 g$ i  timport java.util.ArrayList;
( [- h1 Z! v  g. w. K. e  Gimport java.util.Enumeration;
, e( h' P% I) x' i: ]! wimport java.util.List;% y7 a  t3 M5 _" r# s& k
import java.util.zip.ZipEntry;
0 C3 x: ?0 c- |) \: S1 bimport java.util.zip.ZipFile;8 O' \- k3 u# c
import java.util.zip.ZipOutputStream;) s. x3 z, [# O0 i9 A3 W
/**. o1 P6 n0 D* l9 w
* 此类用于测试JAVA的ZIP压缩及解压
. C; n! ?0 m. N% h4 g, g' j* + z3 n# e% C4 W1 F6 e% x
* @author Sunny Lee (2008-1-4)  Y2 x1 C- V+ ^* P
* @version 1.0
5 W5 Z" N8 ], t- D& ?*/3 Y! Z6 H& E, C2 v2 L1 y
public class ZipManager {
+ ~% n2 m5 ?& N& [/ f/**
8 H* `6 P  Q" o- E8 h# z! h2 X( w$ u* zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
% w; d& L4 `& V! S* 此方法可保留被压缩文件的目录结构
8 W, e# A2 d0 Y& f9 O! Y/ w) G*
4 Y3 _2 h0 R- r$ h7 q1 x* @param baseDir
9 }- U# z0 d7 D9 C8 ~( f*            所要压缩的目录名(包含绝对路径); v  t% G8 _. y: J% R6 t
* @param objFileName
2 G4 x: y- k; b$ c6 G' U6 ~; M; l*            压缩后的文件名0 \7 s  X8 I- a
* @throws Exception1 i( @0 h. y  v' N/ s
*/
# a+ P7 T" ^1 gpublic boolean createZip(String baseDir, String objFileName) throws Exception {6 c/ z8 a( k* J  }! z8 m
   File folderObject = new File(baseDir);( p: |" ^# P2 C" z
   if (folderObject.exists()) {7 p0 Z8 A# S0 F: a1 i
    List fileList = getSubFiles(new File(baseDir));
  t: b6 N( h: d" b% ~) S8 e# f, m0 F" Q+ G1 t' e+ e" K
    // 压缩文件名% Z7 h  z6 m# d+ [- ]
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(6 x% H  j8 a( l7 ^) T" r7 b
      objFileName));
9 z  `& \& [8 `1 ^! W    ZipEntry ze = null;& i( M7 p9 }' p0 n1 P3 D7 T1 u0 L
    byte[] buf = new byte[1024];% ^0 ^' w: x$ V( U/ M
    int readLen = 0;/ u/ [. D+ s# r) M9 c9 l3 ~, p0 X
    ze = new ZipEntry(getAbsFileName(baseDir,folderObject));
/ o; }4 Z5 y: P* `! s/ N) G  H    zos.putNextEntry(ze);
  g/ {; J, s5 B  I; {3 x  n2 f    for (int i = 0; i < fileList.size(); i++) {3 `7 l5 T! i$ @9 N  P; o- T( Z
     File f = (File) fileList.get(i);
9 I0 @/ K3 j4 v; [, o( G* h% F     System.out.println("Adding: " + f.getPath() + f.getName());% \/ s! Z! J# P" Y+ s# N6 V( U
     /*
0 d' b- a( p! G& T* c6 ^( r     * 创建一个ZipEntry,并设置Name和其它的一些属性# H9 @, B4 `! N$ d0 B. l8 H6 k
     * 注意,该ZipEntry是包含目录结构的,此功能是由getAbsFileName(String,string)完成的% W8 \1 Q1 N7 v
     */
$ D+ s0 w% N4 L; Q9 U1 b     ze = new ZipEntry(getAbsFileName(baseDir, f));6 k. u; R* R6 a- s1 J7 }& f
     ze.setSize(f.length());
7 @1 `6 v6 L" \' @& K     ze.setTime(f.lastModified());" R: _* p3 f7 `  e, R
     // 将ZipEntry加到zos中,再写入实际的文件内容
0 D0 m4 i' X2 u1 i  p  i- ]0 S4 w     zos.putNextEntry(ze);
$ H5 }7 I% G( ?  I     InputStream is = new BufferedInputStream(new FileInputStream(f));7 l/ v/ t, W6 f, e
     while ((readLen = is.read(buf, 0, 1024)) != -1) {
! {* K6 z1 Z) e+ W7 j3 n      zos.write(buf, 0, readLen);. s! }$ b: q  X0 h  f! G+ a4 q9 {/ f
     }  \9 m& ^- z( d$ A
     is.close();# _4 q# b( x- ]4 H8 f) |) B
     System.out.println("done...");( W2 j# w/ g) ?
    }
" P5 Q: U/ M% |* o    zos.close();% n: c/ h% |  q* O' z5 T1 F+ ]5 K+ I/ h
    return true;
" J+ g( w1 J5 S/ [+ G2 X  V2 p   } else {
9 I( n* m% L' a4 _7 z- v- i    throw new Exception("this folder isnot exist!");1 ^! ^. J& q( G% u! x
   }
4 c0 C7 Y4 _6 z  L; p}6 W8 {0 y* v6 B) {" r. ?+ `
/**
7 S) d1 {; z( z$ L" M4 ^$ g* 对某一个文件进行压缩,不允许是目录或包含子目录0 F4 }) c( N7 ~$ o+ p
*
# p, _# U  L; V1 P' P* @param sourceFileName: A2 r9 G  z( L0 s5 {% J  ]# I
*            被压缩的目标文件,不允许是目录或包含子目录
# a/ Q' ?) l: Q* @param zipFilename
. o8 j$ r4 S; _1 j2 Z5 a*            为压缩后的文件指定的名称
0 `6 ]" f7 I6 E) b' j* @return 压缩文件的大小
" h6 p: I  \% ?' [4 g* E* @throws Exception7 q; ?# F2 \( V. `& I5 [
*/
$ y% z1 K; X9 h% h& dpublic boolean createFileToZip(String sourceFileName, String zipFilename)) }8 a" h4 A! x- L+ I% K
    throws Exception {
5 s8 z; C4 V; f   File sourceFile = new File(sourceFileName);
' t1 p, A% s* J/ V: k1 o8 {; C   byte[] buf = new byte[1024];
0 T) _) w. C- T4 l* m% V   // 压缩文件名
/ u8 l* C9 z4 o$ {) O7 r6 r   File objFile = new File(zipFilename);( w7 I- {! i! a7 t. E1 W
   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));
& z+ y3 l* R" _: Z# N+ O( L   ZipEntry ze = null;
7 S; l( t9 H) u2 c. F# l& q   // 创建一个ZipEntry,并设置Name和其它的一些属性- b4 t9 R% Z$ g6 ]$ Y% q' a( M# w7 I
   ze = new ZipEntry(sourceFile.getName());0 f  b/ ~3 X: N1 ?8 _, i
   ze.setSize(sourceFile.length());
: c, s2 X9 |* G0 i/ P2 i$ @, [   ze.setTime(sourceFile.lastModified());
0 f) |3 a* ]' _2 c; E   // 将ZipEntry加到zos中,再写入实际的文件内容- M0 R8 D* R- ~/ |
   zos.putNextEntry(ze);
1 q! _3 `* x  K  Q9 e# e& E' H   InputStream is = new BufferedInputStream(
2 b# Y& j  s- d; S$ m, a8 ~) Q     new FileInputStream(sourceFile));& D$ [! u6 I/ o9 V& b6 z, U1 E
   int readLen = -1;
6 K5 Q9 _7 F# P1 x$ B   while ((readLen = is.read(buf, 0, 1024)) != -1) {; [3 U# b7 x, |  k
    zos.write(buf, 0, readLen);
/ Z. r& @4 u7 J" V- b5 M. R   }
; E- {: C3 `$ ]; X3 c, @5 h6 L   is.close();2 I2 W& D2 k' p( h. }
   zos.close();
+ @, N7 ~* c/ A5 k9 ^+ |' c   return true;5 d( A9 B; R1 h+ x$ L5 [7 ]. p
}
! t+ J  ~& s6 b0 s/**
1 D% a* |- Y6 L+ i* 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.
3 g$ D) }6 q2 \% @4 A+ n; ^) o* : ?3 k5 E9 b1 z4 [& Q
* @param sourceZip2 |9 F4 E# F3 F
*            待解压的zip文件1 q- S. a9 Y- J( z( _+ ^( ^7 G
* @param outFileName
3 a; X; w/ a) u* \$ R* @throws IOException; F6 _3 `; D/ _
*/& x/ s$ }  _& V! F# k" c
public boolean releaseZipToFile(String sourceZip, String outFileName)
) k3 D( G& Y0 h; _, \    throws IOException {0 x) f; Y1 |8 ?
   ZipFile zfile = new ZipFile(sourceZip);
* `1 j5 S7 J0 Z- D5 W2 r/ J1 E1 }   File fileOut=new File(outFileName);
; F4 a: {& P3 x0 e* G: q& y5 [8 d0 c1 |+ [7 {6 q
   System.out.println("待解压的文件是: " + zfile.getName());4 ]) ?. E8 O' ^9 w; P
   Enumeration zList = zfile.entries();4 [0 S7 B3 g0 S+ J' v& |$ U
   ZipEntry ze = null;' C, Q& i8 T, ]5 `8 o4 ]
   byte[] buf = new byte[1024];
# J% x% W. O9 \; }2 r8 v   while (zList.hasMoreElements()) {
1 y+ \2 I1 L/ l4 l' q    // 从ZipFile中得到一个ZipEntry+ |* A( [9 E- T" w
    ze = (ZipEntry) zList.nextElement();2 \5 H/ q) s; s, I' c! ~  m
    if (ze.isDirectory()) {! a: m* K* C+ U% I( A1 k
     continue;
9 t. Y' E  L5 V    }9 |7 a/ D2 ?& x: R0 O) T
    // 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
* G) n: @; D; y$ f    InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
8 h/ q9 O- h8 C+ ~, {/ n+ f) B    OutputStream os = new BufferedOutputStream(new FileOutputStream(- F3 y* c! ^7 O/ c* r$ J3 B
      getRealFileName(outFileName, ze.getName())));( {; ?+ D; K" q
    int readLen = 0;( D0 Q2 x, t. Y+ R& q/ F5 N. W# E8 ]
    while ((readLen = is.read(buf, 0, 1024)) != -1) {2 v/ h& A; ~+ r4 t* ?' {
     os.write(buf, 0, readLen);
2 p! R5 L' ?! T! V$ d    }; I3 k1 P( L% N9 R: P
    is.close();9 @5 Z: X9 b: x$ _. ~4 \' L" [
    os.close();  D9 r* M% t/ I( D
    System.out.println("Extracted: " + ze.getName());) X3 a- X. r; D3 p
   }
! o8 R: y& P4 {9 f6 D7 _, O) c6 q   zfile.close();
) L/ x2 \5 c! u7 q1 K" X   return true;
; r" i. ~% w' B8 c( ^$ q0 s. J}2 ^0 ?7 M- t+ v0 t( G9 a
/**
- D# Z7 L- Z  P1 U+ Q  a* 取得指定目录以及其各级子目录下的所有文件的列表,注意,返回的列表中不含目录.* `& b6 S) i5 i3 ?$ Y
*
$ T" ?) g2 S' r* R$ x* @param baseDir
  o: S2 B  V, T*            File 指定的目录
; D( B  l( Q! _8 Z0 t* @return 包含java.io.File的List1 B# m8 Y) u+ \& l1 ^
*/
  {9 t$ j) r* {2 u, Y7 Uprivate List getSubFiles(File baseDir) {
# ]2 y; j1 i; b3 N' P- n# R7 Z   List fileList = new ArrayList();4 f; d# R9 g" d, ]
   File[] tmp = baseDir.listFiles();
; P# A' b" {+ t( x' q! W   for (int i = 0; i < tmp.length; i++) {4 B8 |6 Y$ E/ h4 h7 N8 W0 \
    // 如果是文件,直接加入fileList* m% ~8 Z; F& U* w
    if (tmp[i].isFile()) {
- @0 e, I. Q- S     fileList.add(tmp[i]);
8 [7 y4 Q- D2 K) G    }
! z5 i% F% J0 N2 h    // 如果是目录,递归调用本方法,并将结果集加入fileList
% U4 U$ M  u* y& B3 Y' L    if (tmp[i].isDirectory()) {' g# e7 X+ u& _/ Z* ^# M' `: Z
     fileList.addAll(getSubFiles(tmp[i]));
/ N. k) a# [" O! F3 h4 g    }
; m! \4 u) U9 p; [% A, p/ X" q   }
1 g8 N/ b1 G  a, j   return fileList;' x* g( R5 g4 h0 o8 i# W6 c
}
; O. |0 K6 O& I3 p; G/ @/**
& K7 c3 p5 M, f8 k" q8 t6 v( T! ?1 `& w* 给定根目录,返回一个相对路径所对应的实际文件名.9 f! f) w& F9 R. V% ~1 V+ R
*
$ ^; e8 V+ l  @; \0 x* @param baseDir3 U+ q$ x) p% A- l+ [; K' g
*            指定根目录- C* Q# o; I, U4 E( D7 `
* @param absFileName
3 O9 l6 n' E& e: ?1 `5 f: t*            相对路径名,来自于ZipEntry中的name6 f& h7 b6 U* z$ R" P4 B
* @return java.io.File 实际的文件
. Q3 Q6 f. ?+ S) B4 h9 `*/
: L& y' J# Z* `5 B2 o& A7 Eprivate File getRealFileName(String baseDir, String absFileName) {! J# @7 Y# @8 h. m- ]: t
   String[] dirs = absFileName.split("/");
4 d$ W' p! u0 D: G1 L   File ret = new File(baseDir);
3 {8 G5 a. J- [/ r   // 创建目录结构, t$ e1 [! T7 R6 d( E
   if (dirs.length > 1) {
* i; Q. r$ t7 m. e    for (int i = 0; i < dirs.length - 1; i++) {) r2 I& P  t8 n4 _6 X+ K- I% r
     ret = new File(ret, dirs[i]);
4 c( Z% @( t! n) ~! U    }
" I1 B7 R4 T6 r3 M   }: u* i. S* i- i0 w6 p' b, t, }) M
   if (!ret.exists()) {$ f; H3 p" Q4 \; w6 `
    ret.mkdirs();
; a* u0 `( T$ O! T2 R" i7 r8 W+ Y8 ]$ C1 n   }
. a7 @& V: ]( o3 w5 [) U9 g9 s   ret = new File(ret, dirs[dirs.length - 1]);
9 b$ B6 _) s# p5 e+ K$ u   return ret;
. r: S: i/ [9 e/ G}. {2 }' Y! h2 h8 I  m
/*** M( c, M. C5 Q$ H  m# x' W( W
* 给定根目录及文件的实际路径,返回带有相对路径的文件名,用于zip文件中的路径., f9 n7 Z2 d. Q6 H3 U- o
* 如将绝对路径,baseDir\dir1\dir2\file.txt改成 dir1/dir2/file.txt
" V% E" h+ H. o4 ?* 0 l' q; k0 x8 G) [7 z* d
* @param baseDir
) i1 r$ L/ a4 U+ b! [' T9 Z9 k; J*            java.lang.String 根目录
1 Y$ H" M: i( l9 S* @param realFileName
  s+ Y. U( z, g9 L$ Z*            java.io.File 实际的文件名/ x" P: y7 L+ Q0 G7 D6 P; P' w
* @return 相对文件名
2 ^3 P! f3 Y' ^: d9 P*/# n2 P7 Z/ L7 l# x; v
private String getAbsFileName(String baseDir, File realFileName) {. c7 o( K4 u9 _3 ?4 w
   File real = realFileName;
6 z! P0 U! W& v- b" ~   File base = new File(baseDir);
6 j. e+ C" g+ s3 j, b) j0 U! |   String ret = real.getName();# W- q$ e1 {" B/ z- s0 O: g5 f
   while (true) {
1 B3 V7 ?& T3 W9 \  U% F0 p    real = real.getParentFile();
/ p+ e1 |. |+ k$ z) P& S    if (real == null)6 d9 ]- Y/ C0 D$ b* U. m; O
     break;
) [$ Y1 s" I! I7 G) Y! l    if (real.equals(base))! M7 d. }3 \& z
     break;; X$ Y! @- m" b2 A+ Q! I6 U+ \
    else {
" @7 s. U6 v+ l/ ?- r5 S     ret = real.getName() + "/" + ret;
: I; l8 ~1 L# D    }
% X: t: |1 ^; ~! m   }% a- t8 E9 Q; I
   return ret;- Z1 ^9 e1 v& C6 A# X: A2 y1 ~
}
  L9 d4 d+ o0 V/ n3 _" C3 cpublic static void main(String args[]) {
9 W, }3 `, t& O8 S( R   ZipManager manager = new ZipManager();# Z( w2 o" b4 P/ s2 Z0 y/ b
   try {7 k0 z) r' z6 s7 T2 P, J
    manager.createZip("D:\\yy", "D:\\ss.zip");
* T7 h2 u9 `: D) I, N. G           manager.releaseZipToFile("D:\\ss.zip", "D:\\ss");
: k- B# L; F& I& V' X   // manager.createZip("d:\\temp\\zipout", "d:\\ss//.zip");; f2 c! m: w5 L( l# ?& p
   } catch (Exception e) {. y% U, y3 [* _
    e.printStackTrace();8 s* [# k6 Q( q7 ?, ~. t6 R
   }) A: z9 D  E+ Y# w+ x
   System.out.println("over");$ ]& O, X1 V! @* U7 H% E5 G  R4 T5 |
}0 w3 g* ~  Q: U2 ]
}
9 i8 y. P1 C; L) ]! t4 U

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

GMT+8, 2018-12-18 00:57

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部