最近作的一个Android项目中,须要将一个有20W份html文件的压缩包下载到本地,解压后在本地浏览;在解压的时候尝试了不少方法都没法完成解压(文件数量太大,要么解压超慢要么就内存溢出程序崩溃),后来放弃解压,直接从压缩包中读取文件,下面将方法整理以下html
经过ZipFile.getEntry(“文件名”)
方法获取来获取压缩包中的指定文件对象segmentfault
public static void readZipFile(String file,String fileName) throws Exception {
ZipFile zf = new ZipFile(file);
ZipEntry ze = zf.getEntry(fileName);
InputStream in = zf.getInputStream(ze);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
StringBuffer result = new StringBuffer();
while ((line = br.readLine()) != null) {
result.append(line+"\n");
}
System.out.println(result);
}
在上面的方法中,只要指定压缩包路径(file)以及压缩包中指定的文件名称(fileName),就能够读取到该html文件中的内容;app
接下来咱们对上面的方法进行改造,将指定文件从压缩包中读取出来并写入到指定的目录下,以便于在Android项目中进行查看ui
/** * * @param file 压缩包路径 * @param saveRootDirectory 写入文件夹路径 * @param fileName 文件名 * @throws FileNotFoundException * @throws IOException */public static void writeZipFile(String file,String saveRootDirectory,String fileName) throws FileNotFoundException, IOException {
int len = 0;
ZipFile zf = new ZipFile(file);
ZipEntry ze = zf.getEntry(fileName);
InputStream read = zf.getInputStream(ze);
File writeFile = new File(saveRootDirectory + fileName);
if (!writeFile.exists()) {
File rootDirectoryFile = new File(saveRootDirectory);
//建立目录 if (!rootDirectoryFile.exists()) {
rootDirectoryFile.mkdirs();
}
//建立文件
writeFile.createNewFile();
BufferedOutputStream write = new BufferedOutputStream(new FileOutputStream(file));
//写入文件内容while ((len = read.read()) != -1) {
write.write(len);
}
write.flush();
write.close();
}
read.close();
}
调用writeZipFile
方法,将指定的文件(fileName)从压缩包(file)中读取出来后并写入到指定的文件夹(saveRootDirectory)下,经过WebView.loadUrl("file:///saveRootDirectory/fileName")
实现html文件的查看,经过这种方式,咱们避免了在移动端解压大文件时长时间的等待、甚至是致使程序崩溃这种很差的用户体验,须要查看某个文件从压缩包中读取便可。spa