涉及到知识点:读去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();//解压完毕后,一定要关闭这个压缩输入流。