5.解析文件tar.gz中压缩的json文件,入库

  1. 上代码:
import com.alibaba.fastjson.JSON;
import com.yutu.fileupload.mapper.UserMapper;
import com.yutu.fileupload.pojo.User;
import com.yutu.fileupload.service.UserService;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;

    @Override
    public List<User> findAllUser() {
        return userMapper.findAllUser();
    }

    /**
     * 读取解压后的多个json文件并入库
     * @return
     */
    @Override
    public boolean unTar() {
        //1. 返回一个解压后的路径
        String wjh33 = testUnTarGz(); //f:/wjh33
        //2. 读取其中的json文件
        File file = new File(wjh33);  //f:/wjh33

        //3. 将json中的数据放入集合中,准备入库
        List<Map> result = new ArrayList<>();

        //4. 解析文件
        File[] files = file.listFiles();
        for(File f: files){
            if(f.isDirectory()){// f:/wjh33/wjh
                File[] jsonFiles = f.listFiles();
                for (File jf: jsonFiles){
                    if(!jf.isDirectory()){
                        File file1 = new File(jf.getAbsolutePath());
                        String jsonStr  = readJsonFile(jf);     //将json对象转为json string
                        Map jsonMap = (Map) JSON.parse(jsonStr);//将对象转为map
                        result.add(jsonMap);
                        System.out.println("jsonStr: " + jsonStr);
                    }
                }
            }
        }

        //5. 数据入库
        if(result != null && result.size() > 0){
            for (int i = 0;i<result.size();i++){
                Map map = result.get(i);
                Map<String,String> param = result.get(i);
                String username = (String)map.get("username");
                String password = (String)map.get("password");
                String name = (String)map.get("name");

                param.put("username",username);
                param.put("password",password);
                param.put("name",name);
                userMapper.insertUser(param);
            }
        }

        //6. 删除
        File file1 = new File(wjh33);
        file1.delete();
        return true;
    }

    private String readJsonFile(File jsonFile) {
        String jsonStr = "";
        System.out.println("————开始读取" + jsonFile.getPath() + "文件————");
        try {
            //File jsonFile = new File(fileName);
            FileReader fileReader = new FileReader(jsonFile);
            Reader reader = new InputStreamReader(new FileInputStream(jsonFile), "utf-8");
            int ch = 0;
            StringBuffer sb = new StringBuffer();
            while ((ch = reader.read()) != -1) {
                sb.append((char) ch);
            }
            fileReader.close();
            reader.close();
            jsonStr = sb.toString();
            System.out.println("————读取" + jsonFile.getPath() + "文件结束!————");
            return jsonStr;
        } catch (Exception e) {
            System.out.println("————读取" + jsonFile.getPath() + "文件出现异常,读取失败!————");
            e.printStackTrace();
            return null;
        }
    }

    //返回一个解压后的路径
    private String testUnTarGz() {
        File srcTarGzFile = new File("f:/wjh.tar.gz");//要解压缩的tar.gz文件对象
        String jieyePath = "f:/wjh33";//把解压的文件放置到c盘下的wjh33目录下面
        boolean boo = false;//是否压缩成功
        try {
            unTarGz(srcTarGzFile,jieyePath);
            boo = true;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally{
            //清理操作
            if(!boo)
                deleteDirectory(new File(jieyePath));//目标文件夹 。清理
        }
        return jieyePath;
    }

    /**
     *
     * @param file: 要解压的tar.gz文件对象
     * @param outputDir: 要解压到某个指定的目录下
     */
    private void unTarGz(File file,String outputDir) throws IOException{
        TarInputStream tarIn = null;
        try{
            tarIn = new TarInputStream(new GZIPInputStream(
                    new BufferedInputStream(new FileInputStream(file))),
                    1024 * 2);
            createDirectory(outputDir,null);//创建输出目录
            TarEntry entry = null;
            while( (entry = tarIn.getNextEntry()) != null ){
                if(entry.isDirectory()){//是目录
                    createDirectory(outputDir,entry.getName());//创建空目录
                }else{//是文件
                    File tmpFile = new File(outputDir + "/" + entry.getName());
                    createDirectory(tmpFile.getParent() + "/",null);//创建输出目录
                    OutputStream out = null;
                    try{
                        out = new FileOutputStream(tmpFile);
                        int length = 0;
                        byte[] b = new byte[2048];
                        while((length = tarIn.read(b)) != -1){
                            out.write(b, 0, length);
                        }
                    }catch(IOException ex){
                        throw ex;
                    }finally{
                        if(out!=null)
                            out.close();
                    }
                }
            }
        }catch(IOException ex){
            throw new IOException("解压归档文件出现异常",ex);
        } finally{
            try{
                if(tarIn != null){
                    tarIn.close();
                }
            }catch(IOException ex){
                throw new IOException("关闭tarFile出现异常",ex);
            }
        }
    }

    private void createDirectory(String outputDir,String subDir) {
        File file = new File(outputDir);
        if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空
            file = new File(outputDir + "/" + subDir);
        }
        if(!file.exists()){
            file.mkdirs();
        }
    }

    //清理文件(目录或文件)
    private void deleteDirectory(File file) {
        if(file.isFile()){
            file.delete();//清理文件
        }else{
            File list[] = file.listFiles();
            if(list!=null){
                for(File f: list){
                    deleteDirectory(f);
                }
                file.delete();//清理目录
            }
        }
    }

}
  1. 代码输出json文件中的数据:
2022-05-13 16:57:22.918  INFO 8064 --- [io-18808-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-05-13 16:57:22.918  INFO 8064 --- [io-18808-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-05-13 16:57:22.919  INFO 8064 --- [io-18808-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
————开始读取f:\wjh33\wjh\a.json文件————
————读取f:\wjh33\wjh\a.json文件结束!————
jsonStr: {
	"username":"a",
	"password":"apwd",
	"name":"a"
}
————开始读取f:\wjh33\wjh\b.json文件————
————读取f:\wjh33\wjh\b.json文件结束!————
jsonStr: {
	"username":"b",
	"password":"bpwd",
	"name":"b"
}
————开始读取f:\wjh33\wjh\c.json文件————
————读取f:\wjh33\wjh\c.json文件结束!————
jsonStr: {
	"username":"c",
	"password":"cpwd",
	"name":"c"
}
2022-05-13 16:57:23.142  INFO 8064 --- [io-18808-exec-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2022-05-13 16:57:24.190  INFO 8064 --- [io-18808-exec-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.

  1. 入库:
    在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值