以下是同步下载和异步下载两种方式,下载过程中先把文件保存在临时文件夹,下载完后迁移至需要保存的文件夹
import android.os.AsyncTask;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
import static com.aa.bb.cc.util.FileUtils.SDCARD_SD_TEMP;
import static com.aa.bb.cc.util.FileUtils.moveFile;
public class UrlDownloader {
public static void downloadUrlAsync(String url, String outputFilePath) {
new DownloadTask(url, outputFilePath).execute();
}
private static class DownloadTask extends AsyncTask<Void, Void, Boolean> {
private final String url;
private final String outputFilePath;
public DownloadTask(String url, String outputFilePath) {
this.url = url;
this.outputFilePath = outputFilePath;
}
@Override
protected Boolean doInBackground(Void... params) {
UUID uuid = UUID.randomUUID();
String uniqueKey = uuid.toString().substring(0, 10);
String filePathTemp = SDCARD_SD_TEMP + File.separator + uniqueKey;
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
ResponseBody body = response.body();
if (body != null) {
File fileTemp = new File(filePathTemp);
if (fileTemp.exists()){
fileTemp.delete();
}
try (InputStream inputStream = body.byteStream();
OutputStream outputStream = new FileOutputStream(filePathTemp)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
return moveFile(filePathTemp, outputFilePath);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
public static boolean downloadUrlSync(String url, String outputFilePath) {
UUID uuid = UUID.randomUUID();
String uniqueKey = uuid.toString().substring(0, 10);
String filePathTemp = SDCARD_SD_TEMP + File.separator + uniqueKey;
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
ResponseBody body = response.body();
if (body != null) {
File fileTemp = new File(filePathTemp);
if (fileTemp.exists()){
fileTemp.delete();
}
try (InputStream inputStream = body.byteStream();
OutputStream outputStream = new FileOutputStream(filePathTemp)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
return moveFile(filePathTemp, outputFilePath);
}
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
return false;
}
}