网络url获取zip文件解压为txt文件并将数据保存进数据库

java 网络url获取zip文件解压为txt文件并将数据保存进数据库

有个需求,从s3上拿到zip压缩文件再在代码里进行解压,拿到里面的txt文件,并解析txt文件内容,再保存进数据库

个人习惯直接上代码

@Slf4j
@Service
public class BizCheckQuartz {

    /**
     * 对账文件表
     */
    @Autowired
    ICieoDivisionAttachApi iCieoDivisionAttachApi;
    @Autowired
    S3Config s3Config;


    public Result<String> setFile() {
        Result<String> result=new Result<>();

        List<CieoDivisionAttachDto> cieoDivisionAttachDtos = iCieoDivisionAttachApi.queryAllCieoDivisionAttachEntity();
        for (CieoDivisionAttachDto cieoDivisionAttachDto : cieoDivisionAttachDtos) {
            if(!StringUtils.isEmpty(cieoDivisionAttachDto.getKeyurl())){
                MultipartFile fileItem =null;
                try {
                    fileItem = this.createFileItem(s3Config.getStaticDomain() + cieoDivisionAttachDto.getKeyurl(), cieoDivisionAttachDto.getFilename());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //文件不等于空
                if(!fileItem.isEmpty()){
                    //转成zip文件
                    Map<String,String> stringInputStreamMap = this.checkZip(fileItem);
                    for(String key:stringInputStreamMap.keySet()){
                        //按照行来分隔
                        String[] split = stringInputStreamMap.get(key).split("\\r?\\n");

                    }
                }

            }
        }
        //s3Config.getStaticDomain()
        return result.success("查询成功");
    }

    /**
     * url转变为 MultipartFile对象
     * @param url
     * @param fileName
     * @return
     * @throws Exception
     */
    private static MultipartFile createFileItem(String url, String fileName) throws Exception{
        FileItem item = null;
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
            conn.setReadTimeout(30000);
            conn.setConnectTimeout(30000);
            //设置应用程序要从网络连接读取数据
            conn.setDoInput(true);
            conn.setRequestMethod("GET");
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream is = conn.getInputStream();
                FileItemFactory factory = new DiskFileItemFactory(16, null);
                String textFieldName = "uploadfile";
                item = factory.createItem(textFieldName, ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName);
                OutputStream os = item.getOutputStream();

                int bytesRead = 0;
                byte[] buffer = new byte[8192];
                while ((bytesRead = is.read(buffer, 0, 8192)) != -1) {
                    os.write(buffer, 0, bytesRead);
                }
                os.close();
                is.close();
            }
        } catch (IOException e) {
            throw new RuntimeException("文件下载失败", e);
        }
        return new CommonsMultipartFile(item);
    }

    /**
     * 将MultipartFile转换为zipFile,用断言过滤
     * @param inFile
     */
    public Map<String,String> checkZip(MultipartFile inFile) {
        InputStream fileStream = null;
        InputStream inputStream =null;
        File file = null;
        Stream<? extends ZipEntry> signStream = null;
        Stream<? extends ZipEntry> zipStream = null;
        ZipFile zipFile = null;
        //临时文件
        Path path = Paths.get(System.getProperty("java.io.tmpdir"), inFile.getName() + UUID.randomUUID() + "zip");
        file = path.toFile();
        Map<String,String> map=new HashMap<>();
        try {
            fileStream = inFile.getInputStream();
            org.apache.commons.io.FileUtils.copyInputStreamToFile(fileStream, file);
            zipFile = new ZipFile(file, Charset.defaultCharset());
            signStream = zipFile.stream();
            zipStream = zipFile.stream();
            try {
                Enumeration<? extends ZipEntry> entries = zipFile.entries();
                while (entries.hasMoreElements()) {
                    ZipEntry zipEntry = entries.nextElement();
                    if(zipEntry.isDirectory()){
                        //为空的文件夹什么都不做
                    }else {
                        String name = zipEntry.getName();
                        //根据文件拿到文件内容
                        inputStream = zipFile.getInputStream(zipFile.getEntry(name));

                        String s = this.readStream(inputStream);
                        map.put(name, s);
                        System.out.println("-------------------------------" + name);
                    }
                }
                zipFile.close();
            }catch (Exception e){
                log.error("失败!",e);
            }
            return map;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭流
                inputStream.close();
                fileStream.close();
                signStream.close();
                zipStream.close();
                zipFile.close();
                //删除临时文件
                FileUtils.deleteQuietly(file);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return null;
    }

    /**
     * InputStream转为String
     * @param is
     * @return
     */
    public static String readStream(InputStream is) {

        try {
            ByteArrayOutputStream boa=new ByteArrayOutputStream();
            int len=0;
            byte[] buffer=new byte[1024];

            while((len=is.read(buffer))!=-1){
                boa.write(buffer,0,len);
            }
            is.close();
            boa.close();
            byte[] result=boa.toByteArray();
            String temp=new String(result);
            //识别编码
            if(temp.contains("UTF-8")){
                return new String(result,"UTF-8");
            }else if(temp.contains("GBK")){
                return new String(result,"GBK");
            }else{
                return new String(result,"UTF-8");
            }
        } catch (Exception e) {
            log.error("InputStream转为String失败!",e);
            e.printStackTrace();
            return null;
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值