package jframework.commons.util; |
002 |
003 | import java.io.BufferedInputStream; |
004 | import java.io.BufferedOutputStream; |
005 | import java.io.File; |
006 | import java.io.FileInputStream; |
007 | import java.io.FileNotFoundException; |
008 | import java.io.FileOutputStream; |
009 | import java.io.IOException; |
010 | import java.io.InputStream; |
011 | import java.io.OutputStream; |
012 | import java.util.ArrayList; |
013 | import java.util.Enumeration; |
014 | import java.util.List; |
015 | import org.apache.tools.zip.ZipEntry; |
016 | import org.apache.tools.zip.ZipFile; |
017 | import org.apache.tools.zip.ZipOutputStream; |
018 |
019 | /** |
020 |
* @author WYY |
021 |
* @description 压缩工具类 |
022 |
*/ |
023 | public class ZipTool |
024 | { |
025 | public static final int BUFFER = 1024 ; // 缓存大小 |
026 |
027 | /** |
028 | * @description 压缩文件或目录(包含子目录压缩) |
029 | * @updated by WYY 2013年11月14日 下午10:11:34 |
030 | * @param baseDir |
031 | * 待压缩目录或文件 |
032 | * @param dest |
033 | * 要所后的文件名 |
034 | */ |
035 | public static void zip(String baseDir, String dest) |
036 | { |
037 | File sourceFile = new File(baseDir); |
038 | File destFile = new File(dest); |
039 | ZipOutputStream zos = null ; |
040 | try |
041 | { |
042 | if (sourceFile.isFile()) |
043 | { // 单个文件压缩 |
044 | zos = new ZipOutputStream( new FileOutputStream(destFile)); |
045 | zipFile(baseDir, sourceFile, zos); |
046 | } |
047 | else |
048 | { // 文件夹压缩 |
049 | List<File> fileList = getSubFiles(sourceFile); |
050 | zos = new ZipOutputStream( new FileOutputStream(destFile)); |
051 | for ( int i = 0 ; i < fileList.size(); i++) |
052 | { |
053 | File subFile = (File) fileList.get(i); |
054 | zipFile(baseDir, subFile, zos); |
055 | } |
056 | } |
057 | } |
058 | catch (IOException e) |
059 | { |
060 | e.getMessage(); |
061 | } |
062 | finally |
063 | { |
064 | IOUtil.closeQuietly(zos); |
065 | } |
066 | } |
067 |
068 | /** |
069 | * @description 压缩文件 |
070 | * @updated by WYY 2013年11月14日 下午10:13:11 |
071 | * @param baseDir |
072 | * 基本目录 |
073 | * @param file |
074 | * 本次压缩的文件 |
075 | * @param zos |
076 | * @throws IOException |
077 | * @throws FileNotFoundException |
078 | */ |
079 | private static void zipFile(String baseDir, File file, ZipOutputStream zos) throws IOException, |
080 | FileNotFoundException |
081 | { |
082 | byte [] buf = new byte [BUFFER]; |
083 | int readLen = 0 ; |
084 | ZipEntry ze = new ZipEntry(getAbsFileName(baseDir, file)); |
085 | ze.setSize(file.length()); |
086 | ze.setTime(file.lastModified()); |
087 | zos.putNextEntry(ze); |
088 | InputStream is = new BufferedInputStream( new FileInputStream(file)); |
089 | while ((readLen = is.read(buf, 0 , BUFFER)) != - 1 ) |
090 | { |
091 | zos.write(buf, 0 , readLen); |
092 | } |
093 | IOUtil.closeQuietly(is); |
094 | } |
095 |
096 | /** |
097 | * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径. |
098 | * |
099 | * @param baseDir |
100 | * java.lang.String 根目录 |
101 | * @param realFileName |
102 | * java.io.File 实际的文件名 |
103 | * @return 相对文件名 |
104 | */ |
105 | private static String getAbsFileName(String baseDir, File realFileName) |
106 | { |
107 | File real = realFileName; |
108 | File base = new File(baseDir); |
109 | String ret = real.getName(); |
110 | if (real.equals(base)) // baseDir 为文件时,直接返回 |
111 | { |
112 | return ret; |
113 | } |
114 | else |
115 | { |
116 | while ( true ) |
117 | { |
118 | real = real.getParentFile(); |
119 | if (real == null ) |
120 | break ; |
121 | if (real.equals(base)) |
122 | break ; |
123 | else |
124 | ret = real.getName() + "/" + ret; |
125 | } |
126 | } |
127 | return ret; |
128 | } |
129 |
130 | /** |
131 | * 取得指定目录下的所有文件列表,包括子目录下的文件. |
132 | * |
133 | * @param baseDir |
134 | * File 指定的目录 |
135 | * @return 包含java.io.File的List |
136 | */ |
137 | private static List<File> getSubFiles(File baseDir) |
138 | { |
139 | List<File> ret = new ArrayList<File>(); |
140 | File[] tmp = baseDir.listFiles(); |
141 | for ( int i = 0 ; i < tmp.length; i++) |
142 | { |
143 | if (tmp[i].isFile()) |
144 | ret.add(tmp[i]); |
145 | if (tmp[i].isDirectory()) |
146 | ret.addAll(getSubFiles(tmp[i])); |
147 | } |
148 | return ret; |
149 | } |
150 |
151 | /** |
152 | * 解压缩功能. 将zipFile文件解压到zipDir目录下. |
153 | * |
154 | * @throws Exception |
155 | */ |
156 | public static void unzip(String zipDir, String zipFile) |
157 | { |
158 | ZipFile zfile = null ; |
159 | InputStream is = null ; |
160 | OutputStream os = null ; |
161 | try |
162 | { |
163 | zfile = new ZipFile(zipFile); |
164 | Enumeration<?> zList = zfile.getEntries(); |
165 | ZipEntry ze = null ; |
166 | byte [] buf = new byte [ 1024 ]; |
167 | while (zList.hasMoreElements()) |
168 | { |
169 | ze = (ZipEntry) zList.nextElement(); |
170 | if (ze.isDirectory()) |
171 | { |
172 | File f = new File(zipDir + ze.getName()); |
173 | f.mkdir(); |
174 | continue ; |
175 | } |
176 | os = new BufferedOutputStream( new FileOutputStream(getRealFileName(zipDir, ze.getName()))); |
177 | is = new BufferedInputStream(zfile.getInputStream(ze)); |
178 | int readLen = 0 ; |
179 | while ((readLen = is.read(buf, 0 , 1024 )) != - 1 ) |
180 | { |
181 | os.write(buf, 0 , readLen); |
182 | } |
183 | IOUtil.closeQuietly(is); |
184 | IOUtil.closeQuietly(os); |
185 | } |
186 | zfile.close(); |
187 | } |
188 | catch (IOException e) |
189 | { |
190 | e.printStackTrace(); |
191 | } |
192 | finally |
193 | { |
194 | IOUtil.closeQuietly(is); |
195 | IOUtil.closeQuietly(os); |
196 | try |
197 | { |
198 | if ( null != zfile) |
199 | { |
200 | zfile.close(); |
201 | } |
202 | } |
203 | catch (IOException ex) |
204 | { |
205 | // ignore |
206 | } |
207 | } |
208 | } |
209 |
210 | /** |
211 | * 给定根目录,返回一个相对路径所对应的实际文件名. |
212 | * |
213 | * @param baseDir |
214 | * 指定根目录 |
215 | * @param absFileName |
216 | * 相对路径名,来自于ZipEntry中的name |
217 | * @return java.io.File 实际的文件 |
218 | */ |
219 | public static File getRealFileName(String baseDir, String absFileName) |
220 | { |
221 | String[] dirs = absFileName.split( "/" ); |
222 | File ret = new File(baseDir); |
223 | if (dirs.length > 1 ) |
224 | { |
225 | for ( int i = 0 ; i < dirs.length - 1 ; i++) |
226 | { |
227 | ret = new File(ret, dirs[i]); |
228 | } |
229 | if (!ret.exists()) |
230 | ret.mkdirs(); |
231 | ret = new File(ret, dirs[dirs.length - 1 ]); |
232 | return ret; |
233 | } |
234 | ret = new File(ret, dirs[dirs.length - 1 ]); |
235 | return ret; |
236 | } |
237 |
238 | public static void main(String[] args) throws Exception |
239 | { |
240 | // 测试 |
241 | ZipTool.zip( "E:/mdf" , "E:/mdf/22.zip" ); |
242 | ZipTool.unzip( "E:/mdf" , "E:/mdf/22.zip" ); |
243 | } |
244 | } |
2. [代码][Java]代码 跳至[1][2][全屏预览]
01 | package jframework.commons.util; |
02 |
03 | import java.io.Closeable; |
04 | import java.io.IOException; |
05 |
06 | /** |
07 |
* @author WYY |
08 |
* @description |
09 |
*/ |
10 | public class IOUtil |
11 | { |
12 |
13 | /** |
14 | * @description 关闭流 |
15 | * @updated by WYY 2013年11月14日 下午10:10:25 |
16 | * @param closeable |
17 | */ |
18 | public static void closeQuietly(Closeable closeable) |
19 | { |
20 | try |
21 | { |
22 | if ( null != closeable) |
23 | { |
24 | closeable.close(); |
25 | } |
26 | } |
27 | catch (IOException e) |
28 | { |
29 | // ignore |
30 | } |
31 | } |
32 | } |