涉及到知识点:读去assets目录中文件、文件解压、文件复制等
获取压缩文件长度说明:
1、File.length():路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。
2、InputStream.available();:返回的值是一个估算值.不能依赖这个值来分配空间
3、获取压缩文件的准确长度方法:
InputStream is = this.getAssets().open("data.zip");
while( is.skip(65536) > 0 ) { };//通过循环跳到文件尾获取
一、在SD卡中创建解压文件存放目录:
File file =new File("/sdcard/mydata");
file.mkdirs();
二、打开资源文件
InputStream inputStream = this.getAssets().open("data.zip");
getAssets():获取assets资源管理器,AssetsManager.
通过资源管理器打开Assets目录中的资源文件“data.zip”:
三、根据资源文件输入流构造一个压缩包输入流
ZipInputStream zip = new ZipInputStream(stream);
四、解压文件到先前创建的目录,伪代码如下:
while(true) { //取得压缩文件的一个个子元素,同时流指针也定位到该文件的开头 ZipEntry entry = zip.getNextEntry(); //如果元素为空,表明压缩文件已经读取完毕 if( entry == null ) break; //如果是目录,则创建相应目录结构,接着直接读取下一个元素 if( entry.isDirectory() ) { (new File("/sdcard/mydata/dir" )).mkdirs(); continue; } //如果是文件,在SD卡的指定目录创建该节点文件 OutputStream out = new FileOutputStream( path ); //从zip输入流中读取文件,并写到输出流 //读取当前元素:通过zip.getNextEntry(),流指针已经定位到要读的文件 int len = zip.read(buf); while (len >= 0) { if(len > 0) out.write(buf, 0, len);//将当前元素的内容拷贝到目标文件 len = zip.read(buf); } //数据写入磁盘,并关闭输出流 out.flush(); out.close(); out = null; }
stream.close();//解压完毕后,一定要关闭这个压缩输入流。