假设 文件/文件夹 分布如下:
dir0/file0
dir0/dir1/file1
dir0/dir2/file2
可以用递归遍历所有文件并打包,那么压缩包结构为:
zip/file0
zip/file1
zip/file2
如果想维持原来的 文件/文件夹 分布结构,即期望的压缩包结构为:
zip/dir0/file0
zip/dir0/dir1/file1
zip/dir0/dir2/file2
那么就要注意 绝对路径 与 相对路径 的问题,下面是参考代码:
/*
* Usage: zipDirectory("/sdcard/resource", "/sdcard/log.zip");
*/
public static boolean zipDirectory(String sourcePath, String zipFilePath) {
final int BUFFER = 2048;
File sourceFile = new File(sourcePath);
try {
BufferedInputStream bufferedInputStream = null;
FileOutputStream fileOutputStream = new FileOutputStream(zipFilePath);
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(
fileOutputStream));
if (sourceFile.isDirectory()) {
zipSubDirectory(zipOutputStream, sourceFile, sourceFile.getParent().length());
} else {
byte data[] = new byte[BUFFER];
FileInputStream fileInputStream = new FileInputStream(sourcePath);
bufferedInputStream = new BufferedInputStream(fileInputStream, BUFFER);
ZipEntry zipEntry = new ZipEntry(getLastPathComponent(sourcePath));
zipOutputStream.putNextEntry(zipEntry);
int count;
while ((count = bufferedInputStream.read(data, 0, BUFFER)) != -1) {
zipOutputStream.write(data, 0, count);
}
}
zipOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/*
* Zips a subfolder
*/
private static void zipSubDirectory(ZipOutputStream zipOutputStream,
File directory,
int basePathLength)
throws IOException {
final int BUFFER = 2048;
File[] fileList = directory.listFiles();
BufferedInputStream bufferedInputStream = null;
for (File file : fileList) {
if (file.isDirectory()) {
zipSubDirectory(zipOutputStream, file, basePathLength);
} else {
byte data[] = new byte[BUFFER];
String unmodifiedFilePath = file.getPath();
String relativePath = unmodifiedFilePath
.substring(basePathLength);
FileInputStream fileInputStream = new FileInputStream(unmodifiedFilePath);
bufferedInputStream = new BufferedInputStream(fileInputStream, BUFFER);
ZipEntry zipEntry = new ZipEntry(relativePath);
zipOutputStream.putNextEntry(zipEntry);
int count;
while ((count = bufferedInputStream.read(data, 0, BUFFER)) != -1) {
zipOutputStream.write(data, 0, count);
}
bufferedInputStream.close();
}
}
}
/*
* gets the last path component Example:
* getLastPathComponent("/sdcard/fileToZip"); Result: "fileToZip"
*/
public static String getLastPathComponent(String filePath) {
String[] segments = filePath.split("/");
String lastPathComponent = segments[segments.length - 1];
return lastPathComponent;
}
代码写得比较潦草,先凑合着用吧,有闲的时候再优化一下。
网友评论