大量json数据解析OOM 存储数据库 assets下的json压缩文件解压

项目背景: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 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;
    }

 

截止到这里,解压和解析的工作就结束了,剩下的写入数据库操作,下次再更......

你可能感兴趣的:(安卓)