最近做的一個Android項目中,需要將一個有20W份html文件的壓縮包下載到本地,解壓后在本地瀏覽;在解壓的時候嘗試了很多方法都無法完成解壓(文件數量太大,要么解壓超慢要么就內存溢出程序崩潰),后來放棄解壓,直接從壓縮包中讀取文件,下面將方法整理如下
通過
ZipFile.getEntry(“文件名”)
方法獲取來獲取壓縮包中的指定文件對象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文件中的內容;
接下來我們對上面的方法進行改造,將指定文件從壓縮包中讀取出來並寫入到指定的目錄下,以便於在Android項目中進行查看
/** * * @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文件的查看,通過這種方式,我們避免了在移動端解壓大文件時長時間的等待、甚至是導致程序崩潰這種不好的用戶體驗,需要查看某個文件從壓縮包中讀取即可。