异步下载模式:
/**
* Created by zhuangxiaozheng on 2021/10/9.
*/
public class DownLoaderTask extends AsyncTask<Void, Integer, Long> {
private final String TAG = "DownLoaderTask";
private URL mUrl;
private File mFile;
private ProgressDialog mDialog;
private int mProgress = 0;
private ProgressReportingOutputStream mOutputStream;
private Context mContext;
public DownLoaderTask(String url, String out, Context context) {
super();
if (context != null) {
mDialog = new ProgressDialog(context);
mContext = context;
} else {
mDialog = null;
}
try {
mUrl = new URL(url);
String fileName = new File(mUrl.getFile()).getName();
mFile = new File(out, fileName);
Log.d(TAG, "out=" + out + ", name=" + fileName + ",mUrl.getFile()=" + mUrl.getFile());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
//super.onPreExecute();
if (mDialog != null) {
mDialog.setTitle("Downloading...");
mDialog.setMessage(mFile.getName());
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
cancel(true);
}
});
mDialog.show();
}
}
@Override
protected Long doInBackground(Void... params) {
// TODO Auto-generated method stub
return download();
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
//super.onProgressUpdate(values);
if (mDialog == null)
return;
if (values.length > 1) {
int contentLength = values[1];
if (contentLength == -1) {
mDialog.setIndeterminate(true);
} else {
mDialog.setMax(contentLength);
}
} else {
mDialog.setProgress(values[0].intValue());
}
}
@Override
protected void onPostExecute(Long result) {
// TODO Auto-generated method stub
//super.onPostExecute(result);
if (mDialog != null && mDialog.isShowing()) {
mDialog.dismiss();
}
if (isCancelled())
return;
// ((MainActivity)mContext).showUnzipDialog();
}
private long download() {
URLConnection connection = null;
int bytesCopied = 0;
try {
connection = mUrl.openConnection();
int length = connection.getContentLength();
if (mFile.exists() && length == mFile.length()) {
Log.d(TAG, "file " + mFile.getName() + " already exits!!");
return 0l;
}
mOutputStream = new ProgressReportingOutputStream(mFile);
publishProgress(0, length);
bytesCopied = copy(connection.getInputStream(), mOutputStream);
if (bytesCopied != length && length != -1) {
Log.e(TAG, "Download incomplete bytesCopied=" + bytesCopied + ", length" + length);
}
mOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bytesCopied;
}
private int copy(InputStream input, OutputStream output) {
byte[] buffer = new byte[1024 * 8];
BufferedInputStream in = new BufferedInputStream(input, 1024 * 8);
BufferedOutputStream out = new BufferedOutputStream(output, 1024 * 8);
int count = 0, n = 0;
try {
while ((n = in.read(buffer, 0, 1024 * 8)) != -1) {
out.write(buffer, 0, n);
count += n;
}
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return count;
}
private final class ProgressReportingOutputStream extends FileOutputStream {
public ProgressReportingOutputStream(File file) throws FileNotFoundException {
super(file);
}
@Override
public void write(byte[] buffer, int byteOffset, int byteCount) throws IOException {
super.write(buffer, byteOffset, byteCount);
mProgress += byteCount;
publishProgress(mProgress);
}
}
}
异步解压模式:
/**
* Created by zhuangxiaozheng on 2021/10/9.
*/
public class ZipExtractorTask extends AsyncTask<Void, Integer, Long> {
private final String TAG = "ZipExtractorTask";
private final File mInput;
private final File mOutput;
private final ProgressDialog mDialog;
private int mProgress = 0;
private final Context mContext;
private boolean mReplaceAll;
public ZipExtractorTask(String in, String out, Context context, boolean replaceAll) {
super();
mInput = new File(in);
mOutput = new File(out);
if (!mOutput.exists()) {
if (!mOutput.mkdirs()) {
Log.e(TAG, "Failed to make directories:" + mOutput.getAbsolutePath());
}
}
if (context != null) {
mDialog = new ProgressDialog(context);
} else {
mDialog = null;
}
mContext = context;
mReplaceAll = replaceAll;
}
@Override
protected Long doInBackground(Void... params) {
// TODO Auto-generated method stub
return unzip();
}
@Override
protected void onPostExecute(Long result) {
// TODO Auto-generated method stub
//super.onPostExecute(result);
if (mDialog != null && mDialog.isShowing()) {
mDialog.dismiss();
}
if (isCancelled())
return;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
//super.onPreExecute();
if (mDialog != null) {
mDialog.setTitle("Extracting");
mDialog.setMessage(mInput.getName());
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
cancel(true);
}
});
mDialog.show();
}
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
//super.onProgressUpdate(values);
if (mDialog == null)
return;
if (values.length > 1) {
int max = values[1];
mDialog.setMax(max);
} else
mDialog.setProgress(values[0].intValue());
}
private long unzip() {
long extractedSize = 0L;
Enumeration<ZipEntry> entries;
ZipFile zip = null;
try {
zip = new ZipFile(mInput);
long uncompressedSize = getOriginalSize(zip);
publishProgress(0, (int) uncompressedSize);
entries = (Enumeration<ZipEntry>) zip.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
if (entry.isDirectory()) {
continue;
}
File destination = new File(mOutput, entry.getName());
if (!destination.getParentFile().exists()) {
Log.e(TAG, "make=" + destination.getParentFile().getAbsolutePath());
destination.getParentFile().mkdirs();
}
if (destination.exists() && mContext != null && !mReplaceAll) {
}
ProgressReportingOutputStream outStream = new ProgressReportingOutputStream(destination);
extractedSize += copy(zip.getInputStream(entry), outStream);
outStream.close();
}
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (zip != null) {
zip.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return extractedSize;
}
private long getOriginalSize(ZipFile file) {
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) file.entries();
long originalSize = 0l;
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
if (entry.getSize() >= 0) {
originalSize += entry.getSize();
}
}
return originalSize;
}
private int copy(InputStream input, OutputStream output) {
byte[] buffer = new byte[1024 * 8];
BufferedInputStream in = new BufferedInputStream(input, 1024 * 8);
BufferedOutputStream out = new BufferedOutputStream(output, 1024 * 8);
int count = 0, n = 0;
try {
while ((n = in.read(buffer, 0, 1024 * 8)) != -1) {
out.write(buffer, 0, n);
count += n;
}
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return count;
}
private final class ProgressReportingOutputStream extends FileOutputStream {
public ProgressReportingOutputStream(File file)
throws FileNotFoundException {
super(file);
// TODO Auto-generated constructor stub
}
@Override
public void write(byte[] buffer, int byteOffset, int byteCount)
throws IOException {
// TODO Auto-generated method stub
super.write(buffer, byteOffset, byteCount);
mProgress += byteCount;
publishProgress(mProgress);
}
}
}
使用释放:
if (vid == R.id.download_file) {
File srcDir = new File(FileUtil.getSDCardPath() + "html");
if (!srcDir.exists()) { //判断该文件夹是否存在,不存在则创建
FileUtil.createFolder(FileUtil.getSDCardPath(), "html");
}
DownLoaderTask downLoaderTask = new DownLoaderTask(downloadUrl, FileUtil.getSDCardPath() + "html", v.getContext());
downLoaderTask.execute();
} else if (vid == R.id.unZipFolder_file) {
File srcDir = new File(FileUtil.getSDCardPath() + "html/main.zip");
if (srcDir.exists()) { //判断该解压包文件是否存在
File srcDir2 = new File(FileUtil.getSDCardPath() + "html");
if (!srcDir2.exists()) { //判断解压的路径(文件夹)是否存在,不存在则创建
FileUtil.createFolder(FileUtil.getSDCardPath(), "html");
}
ZipExtractorTask zipExtractorTask = new ZipExtractorTask(FileUtil.getSDCardPath() + "html/main.zip", FileUtil.getSDCardPath() + "html", v.getContext(), true);
zipExtractorTask.execute();
} else {
Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
}
}
/**
* 获取SDCard根目录
*
* @return
*/
public static String getSDCardPath() {
File sdDirFile = null;
if (isExternalStorageWritable()) {
sdDirFile = Environment.getExternalStorageDirectory();//获取根目录
}
return sdDirFile != null ? sdDirFile.toString() + File.separator : null;
}
/**
* 判断外部存储是否可用
*/
public static boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
LogUtils.e("请检查SD卡是否可用");
return false;
}
/**
* 创建文件夹
*
* @param dir 文件夹路径
* @param folderName 文件夹名称
*/
public static String createFolder(String dir, String folderName) {
String folderPath = dir + folderName;
//新建一个File,传入文件夹目录
File file = new File(folderPath);
//判断文件夹是否存在,如果不存在就创建,否则不创建
if (!file.exists()) {
//通过file的mkdirs()方法创建目录中包含却不存在的文件夹
boolean mkdirs = file.mkdirs();
if (mkdirs) LogUtils.i(String.format("目录:%s 创建成功", folderName));
else LogUtils.i(String.format("目录:%s 创建失败", folderName));
} else {
LogUtils.i(String.format("目录:%s 已经存在", folderName));
}
return file.getAbsolutePath();
}