最近作的一個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