下载Zip文件和其他的网络下载没什么区别,就是存储的时候后缀为.zip。
下面使用的是静态内部类和弱引用的方式,目的是防止内存泄漏。
//下载Zip文件并存到本地
private static class MyDownResThread extends Thread{
private WeakReference<AdvActivity> weakReference;
private String downUrl;
public MyDownResThread(AdvActivity advActivity,String downUrl) {
this.downUrl = downUrl;
weakReference = new WeakReference<AdvActivity>(advActivity);
}
@Override
public void run() {
super.run();
FileOutputStream fileOutputStream = null;
InputStream inputStream = null;
try {
URL url = new URL(downUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
fileOutputStream = new FileOutputStream(new File(weakReference.get().getFilesDir() + "/html.zip"));
if (connection.getResponseCode() == 200) {
inputStream = connection.getInputStream();
int len = 0;
byte[] bytes = new byte[1024];
while ((len = inputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
fileOutputStream.flush();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileOutputStream!=null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
下面是对Zip的文件进行解析的过程
//解析Zip的线程
private static class MyZipThread extends Thread{
private File zipFile;
private Enumeration<ZipEntry> entryEnumeration;
private WeakReference<AdvActivity> weakReference;
public MyZipThread(AdvActivity advActivity,File zipFile) {
this.zipFile = zipFile;
weakReference = new WeakReference<AdvActivity>(advActivity);
}
@Override
public void run() {
super.run();
FileOutputStream fileOutputStream = null;
InputStream inputStream = null;
try {
ZipFile zip = new ZipFile(zipFile);
entryEnumeration = (Enumeration<ZipEntry>) zip.entries();
//是否有下一个元素
while (entryEnumeration.hasMoreElements()) {
ZipEntry zipEntry = entryEnumeration.nextElement();
//获得的元素是否是目录,是就跳过
if (zipEntry.isDirectory()) {
continue;
}
File file = new File(weakReference.get().getFilesDir(), zipEntry.getName());
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
fileOutputStream = new FileOutputStream(file);
inputStream = zip.getInputStream(zipEntry);
int len = 0;
byte[] bytes = new byte[1024];
while ((len = inputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
fileOutputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fileOutputStream != null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
主要就是一些流操作,还有就是比较陌生的ZipFile、ZipEntry
如果想看看是否解析成功了,可以打印出来看看,存放的那个目录里有哪些文件
//获取getFilesDir()下的所有文件
File file = new File(String.valueOf(getFilesDir()));
File[] files = file.listFiles();
for (File f : files) {
showFileName(f);
}
//打印文件
private void showFileName(File file) {
if (file.isDirectory()) {
File file1[] = new File(file.getPath()).listFiles();
for (File ff : file1) {
showFileName(ff);
}
} else {
Log.e("---------->", file.getPath());
}
}