/** |
07 | * 文件夹遍历 |
08 | * @author once |
09 | * |
10 | */ |
11 | public class DirTraversal { |
12 | |
13 | //no recursion |
14 | public static LinkedList<File> listLinkedFiles(String strPath) { |
15 | LinkedList<File> list = new LinkedList<File>(); |
16 | File dir = new File(strPath); |
17 | File file[] = dir.listFiles(); |
18 | for ( int i = 0 ; i < file.length; i++) { |
19 | if (file[i].isDirectory()) |
20 | list.add(file[i]); |
21 | else |
22 | System.out.println(file[i].getAbsolutePath()); |
23 | } |
24 | File tmp; |
25 | while (!list.isEmpty()) { |
26 | tmp = (File) list.removeFirst(); |
27 | if (tmp.isDirectory()) { |
28 | file = tmp.listFiles(); |
29 | if (file == null ) |
30 | continue ; |
31 | for ( int i = 0 ; i < file.length; i++) { |
32 | if (file[i].isDirectory()) |
33 | list.add(file[i]); |
34 | else |
35 | System.out.println(file[i].getAbsolutePath()); |
36 | } |
37 | } else { |
38 | System.out.println(tmp.getAbsolutePath()); |
39 | } |
40 | } |
41 | return list; |
42 | } |
43 |
44 | |
45 | //recursion |
46 | public static ArrayList<File> listFiles(String strPath) { |
47 | return refreshFileList(strPath); |
48 | } |
49 |
50 | public static ArrayList<File> refreshFileList(String strPath) { |
51 | ArrayList<File> filelist = new ArrayList<File>(); |
52 | File dir = new File(strPath); |
53 | File[] files = dir.listFiles(); |
54 |
55 | if (files == null ) |
56 | return null ; |
57 | for ( int i = 0 ; i < files.length; i++) { |
58 | if (files[i].isDirectory()) { |
59 | refreshFileList(files[i].getAbsolutePath()); |
60 | } else { |
61 | if (files[i].getName().toLowerCase().endsWith( "zip" )) |
62 | filelist.add(files[i]); |
63 | } |
64 | } |
65 | return filelist; |
66 | } |
67 | } |
|
013 | * Java utils 实现的Zip工具 |
014 | * |
015 | * @author once |
016 | */ |
017 | public class ZipUtils { |
018 | private static final int BUFF_SIZE = 1024 * 1024 ; // 1M Byte |
019 |
020 | /** |
021 | * 批量压缩文件(夹) |
022 | * |
023 | * @param resFileList 要压缩的文件(夹)列表 |
024 | * @param zipFile 生成的压缩文件 |
025 | * @throws IOException 当压缩过程出错时抛出 |
026 | */ |
027 | public static void zipFiles(Collection<File> resFileList, File zipFile) throws IOException { |
028 | ZipOutputStream zipout = new ZipOutputStream( new BufferedOutputStream( new FileOutputStream( |
029 | zipFile), BUFF_SIZE)); |
030 | for (File resFile : resFileList) { |
031 | zipFile(resFile, zipout, "" ); |
032 | } |
033 | zipout.close(); |
034 | } |
035 |
036 | /** |
037 | * 批量压缩文件(夹) |
038 | * |
039 | * @param resFileList 要压缩的文件(夹)列表 |
040 | * @param zipFile 生成的压缩文件 |
041 | * @param comment 压缩文件的注释 |
042 | * @throws IOException 当压缩过程出错时抛出 |
043 | */ |
044 | public static void zipFiles(Collection<File> resFileList, File zipFile, String comment) |
045 | throws IOException { |
046 | ZipOutputStream zipout = new ZipOutputStream( new BufferedOutputStream( new FileOutputStream( |
047 | zipFile), BUFF_SIZE)); |
048 | for (File resFile : resFileList) { |
049 | zipFile(resFile, zipout, "" ); |
050 | } |
051 | zipout.setComment(comment); |
052 | zipout.close(); |
053 | } |
054 |
055 | /** |
056 | * 解压缩一个文件 |
057 | * |
058 | * @param zipFile 压缩文件 |
059 | * @param folderPath 解压缩的目标目录 |
060 | * @throws IOException 当解压缩过程出错时抛出 |
061 | */ |
062 | public static void upZipFile(File zipFile, String folderPath) throws ZipException, IOException { |
063 | File desDir = new File(folderPath); |
064 | if (!desDir.exists()) { |
065 | desDir.mkdirs(); |
066 | } |
067 | ZipFile zf = new ZipFile(zipFile); |
068 | for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements();) { |
069 | ZipEntry entry = ((ZipEntry)entries.nextElement()); |
070 | InputStream in = zf.getInputStream(entry); |
071 | String str = folderPath + File.separator + entry.getName(); |
072 | str = new String(str.getBytes( "8859_1" ), "GB2312" ); |
073 | File desFile = new File(str); |
074 | if (!desFile.exists()) { |
075 | File fileParentDir = desFile.getParentFile(); |
076 | if (!fileParentDir.exists()) { |
077 | fileParentDir.mkdirs(); |
078 | } |
079 | desFile.createNewFile(); |
080 | } |
081 | OutputStream out = new FileOutputStream(desFile); |
082 | byte buffer[] = new byte [BUFF_SIZE]; |
083 | int realLength; |
084 | while ((realLength = in.read(buffer)) > 0 ) { |
085 | out.write(buffer, 0 , realLength); |
086 | } |
087 | in.close(); |
088 | out.close(); |
089 | } |
090 | } |
091 |
092 | /** |
093 | * 解压文件名包含传入文字的文件 |
094 | * |
095 | * @param zipFile 压缩文件 |
096 | * @param folderPath 目标文件夹 |
097 | * @param nameContains 传入的文件匹配名 |
098 | * @throws ZipException 压缩格式有误时抛出 |
099 | * @throws IOException IO错误时抛出 |
100 | */ |
101 | public static ArrayList<File> upZipSelectedFile(File zipFile, String folderPath, |
102 | String nameContains) throws ZipException, IOException { |
103 | ArrayList<File> fileList = new ArrayList<File>(); |
104 |
105 | File desDir = new File(folderPath); |
106 | if (!desDir.exists()) { |
107 | desDir.mkdir(); |
108 | } |
109 |
110 | ZipFile zf = new ZipFile(zipFile); |
111 | for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements();) { |
112 | ZipEntry entry = ((ZipEntry)entries.nextElement()); |
113 | if (entry.getName().contains(nameContains)) { |
114 | InputStream in = zf.getInputStream(entry); |
115 | String str = folderPath + File.separator + entry.getName(); |
116 | str = new String(str.getBytes( "8859_1" ), "GB2312" ); |
117 | // str.getBytes("GB2312"),"8859_1" 输出 |
118 | // str.getBytes("8859_1"),"GB2312" 输入 |
119 | File desFile = new File(str); |
120 | if (!desFile.exists()) { |
121 | File fileParentDir = desFile.getParentFile(); |
122 | if (!fileParentDir.exists()) { |
123 | fileParentDir.mkdirs(); |
124 | } |
125 | desFile.createNewFile(); |
126 | } |
127 | OutputStream out = new FileOutputStream(desFile); |
128 | byte buffer[] = new byte [BUFF_SIZE]; |
129 | int realLength; |
130 | while ((realLength = in.read(buffer)) > 0 ) { |
131 | out.write(buffer, 0 , realLength); |
132 | } |
133 | in.close(); |
134 | out.close(); |
135 | fileList.add(desFile); |
136 | } |
137 | } |
138 | return fileList; |
139 | } |
140 |
141 | /** |
142 | * 获得压缩文件内文件列表 |
143 | * |
144 | * @param zipFile 压缩文件 |
145 | * @return 压缩文件内文件名称 |
146 | * @throws ZipException 压缩文件格式有误时抛出 |
147 | * @throws IOException 当解压缩过程出错时抛出 |
148 | */ |
149 | public static ArrayList<String> getEntriesNames(File zipFile) throws ZipException, IOException { |
150 | ArrayList<String> entryNames = new ArrayList<String>(); |
151 | Enumeration<?> entries = getEntriesEnumeration(zipFile); |
152 | while (entries.hasMoreElements()) { |
153 | ZipEntry entry = ((ZipEntry)entries.nextElement()); |
154 | entryNames.add( new String(getEntryName(entry).getBytes( "GB2312" ), "8859_1" )); |
155 | } |
156 | return entryNames; |
157 | } |
158 |
159 | /** |
160 | * 获得压缩文件内压缩文件对象以取得其属性 |
161 | * |
162 | * @param zipFile 压缩文件 |
163 | * @return 返回一个压缩文件列表 |
164 | * @throws ZipException 压缩文件格式有误时抛出 |
165 | * @throws IOException IO操作有误时抛出 |
166 | */ |
167 | public static Enumeration<?> getEntriesEnumeration(File zipFile) throws ZipException, |
168 | IOException { |
169 | ZipFile zf = new ZipFile(zipFile); |
170 | return zf.entries(); |
171 |
172 | } |
173 |
174 | /** |
175 | * 取得压缩文件对象的注释 |
176 | * |
177 | * @param entry 压缩文件对象 |
178 | * @return 压缩文件对象的注释 |
179 | * @throws UnsupportedEncodingException |
180 | */ |
181 | public static String getEntryComment(ZipEntry entry) throws UnsupportedEncodingException { |
182 | return new String(entry.getComment().getBytes( "GB2312" ), "8859_1" ); |
183 | } |
184 |
185 | /** |
186 | * 取得压缩文件对象的名称 |
187 | * |
188 | * @param entry 压缩文件对象 |
189 | * @return 压缩文件对象的名称 |
190 | * @throws UnsupportedEncodingException |
191 | */ |
192 | public static String getEntryName(ZipEntry entry) throws UnsupportedEncodingException { |
193 | return new String(entry.getName().getBytes( "GB2312" ), "8859_1" ); |
194 | } |
195 |
196 | /** |
197 | * 压缩文件 |
198 | * |
199 | * @param resFile 需要压缩的文件(夹) |
200 | * @param zipout 压缩的目的文件 |
201 | * @param rootpath 压缩的文件路径 |
202 | * @throws FileNotFoundException 找不到文件时抛出 |
203 | * @throws IOException 当压缩过程出错时抛出 |
204 | */ |
205 | private static void zipFile(File resFile, ZipOutputStream zipout, String rootpath) |
206 | throws FileNotFoundException, IOException { |
207 | rootpath = rootpath + (rootpath.trim().length() == 0 ? "" : File.separator) |
208 | + resFile.getName(); |
209 | rootpath = new String(rootpath.getBytes( "8859_1" ), "GB2312" ); |
210 | if (resFile.isDirectory()) { |
211 | File[] fileList = resFile.listFiles(); |
212 | for (File file : fileList) { |
213 | zipFile(file, zipout, rootpath); |
214 | } |
215 | } else { |
216 | byte buffer[] = new byte [BUFF_SIZE]; |
217 | BufferedInputStream in = new BufferedInputStream( new FileInputStream(resFile), |
218 | BUFF_SIZE); |
219 | zipout.putNextEntry( new ZipEntry(rootpath)); |
220 | int realLength; |
221 | while ((realLength = in.read(buffer)) != - 1 ) { |
222 | zipout.write(buffer, 0 , realLength); |
223 | } |
224 | in.close(); |
225 | zipout.flush(); |
226 | zipout.closeEntry(); |
227 | } |
228 | } |
229 | } |