项目背景:assets包下有个json压缩文件,要求对该文件进行解压,再对解压后的json文件进行解析,并最终将数据存入数据库中。json文件包含30万条数据,文件大小是180M,由于数据量大,采用了gson.fromJson(reader, bean) 方式。
解压工具类:
public class ZipUtils {
public static final String TAG = ZipUtils.class.getSimpleName();
/**
* 解压assets目录下的zip到指定的路径
*
* @param zipFileString ZIP的名称,压缩包的名称:json.zip
* @param outPathString 解压后文件存放的路径
* @throws Exception
*/
public static void UnZipAssetsFolder(Context context, String zipFileString, String
outPathString) throws Exception {
ZipInputStream inZip = new ZipInputStream(context.getAssets().open(zipFileString));
ZipEntry zipEntry;
String szName = "";
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
//获取部件的文件夹名
szName = szName.substring(0, szName.length() - 1);
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
RceLog.e(TAG, outPathString + File.separator + szName);
File file = new File(outPathString + File.separator + szName);
if (!file.exists()) {
RceLog.e(TAG, "Create the file:" + outPathString + File.separator + szName);
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();
}
}
}
inZip.close();
}
}
调用解压:
ZipUtils.UnZipAssetsFolder(this, "json.zip", "/storage/emulated/0/json");
解析工具类中的具体实现方法--直接调用即可:
/**
* 从文件中读取信息,并转换为相应对象
*
* @return
*/
public static <T> T readFileDto(Type bean, String filePath) {
File file = new File(filePath);
if (!file.exists()) {
return null;
}
T dto = null;
try {
Reader reader = new FileReader(filePath);
Gson gson = new Gson();
dto = gson.fromJson(reader, bean);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return dto;
}
截止到这里,解压和解析的工作就结束了,剩下的写入数据库操作,下次再更......👌