背景:最近做一个腾讯 cos 桶 文件的读写与本地数据库查询等操作
Retrofit 中文件下载的可以添加 @Streaming
@Streaming
@GET
Observable<ResponseBody> downloadCosFile(@Url String downloadUrl);
@Streaming 的作用:
注解通常用于指示Retrofit或其他HTTP请求库将响应的内容作为流式数据而不是将其全部加载到内存中。这对于处理大文件或流式传输非常有用,因为它可以减少内存占用并提高性能。
HttpCenter.getInstance().requestResponse(HttpCenter.getInstance().getApi().downloadCosFile(fileDownloadPath), new HttpObserver<ResponseBody>(ApiService.GET_COS_FILE_INFO) {
@Override
protected void onFailure(ApiException e) {
NLog.i(TAG, "onFailure: cos 文件 请求失败" + e.getMessage());
callBack.onResult(null);
}
@Override
protected void onSuccess(ResponseBody responseBody) {
NLog.i(TAG, "onSuccess: cos 文件 请求成功");
// 下载文件
AppExecutors.autoExecute(() -> {
// 读入请求体的输入流
InputStream inputStream = responseBody.byteStream();
// 指定文件全路径-》 引申获取Android 几种路径的方式
String zipFilePath = "fileObsolutePath"
File outputFile = new File(zipFilePath); // 保存到应用的私有目录
try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
byte[] buffer = new byte[4 * 1024];
int read;
while ((read = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, read);
}
outputStream.flush();
NLog.i(TAG, "onSuccess: 文件写入成功");
String unZipFileDir;
ZipUtils.UnZipFolder(outputFile.getAbsolutePath(), unZipFileDir, unZipPathList -> {
if (unZipPathList != null && unZipPathList.size() > 0) {
// 每个压缩文件下只有一个文件,所以直接取第一个解压文件路径
NLog.i(TAG, "onSuccess: 解压成功 " + unZipPathList.get(0));
callBack.onResult(unZipPathList.get(0));
} else {
callBack.onResult(null);
}
});
// 删除所有解析数据
deleteDirectory(FileUtil.getSecondFolder(DOWNLOAD_COS_DIR));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}});
}
}
ZipUtils.java 解压文件
public static void UnZipFolder(String zipFileString, String outPathString, ICommListener<List<String>> iCommListener) throws IOException {
ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry;
String szName = "";
List<String> unZipPathList = new ArrayList<>();
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
NLog.i(TAG, "UnZipFolder: zipEntry " + szName);
if (zipEntry.isDirectory()) {
NLog.i(TAG, "UnZipFolder: 解压目录 ");
//获取部件的文件夹名
szName = szName.substring(0, szName.length() - 1);
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
NLog.i(TAG, "UnZipFolder: 解压文件 ");
String unZipPath = outPathString + File.separator + szName;
File file = new File(unZipPath);
if (!file.exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
// 获取文件的输出流
FileOutputStream out = new FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
// 读取(字节)字节到缓冲区
while ((len = inZip.read(buffer)) != -1) {
// 从缓冲区(0)位置写入(字节)字节
out.write(buffer, 0, len);
out.flush();
}
out.close();
unZipPathList.add(unZipPath);
NLog.i(TAG, "UnZipFolder: 解压文件写入完成 ");
}
}
inZip.close();
iCommListener.onResult(unZipPathList);
NLog.i(TAG, "UnZipFolder: 解压结束");
}
删除目录
public static boolean deleteDir(final File dir) {
if (dir == null) return false;
// dir doesn't exist then return true
if (!dir.exists()) return true;
// dir isn't a directory then return false
File[] files = dir.listFiles();
if (files != null && files.length != 0) {
for (File file : files) {
if (file.isFile()) {
if (!file.delete()) return false;
} else if (file.isDirectory()) {
if (!deleteDir(file)) return false;
}
}
}
return dir.delete();
}