Java读取zip里面的文本和压缩zip文件

1 篇文章 0 订阅
1 篇文章 0 订阅

业务背景

有同学在页面录制视频时,将生产地址写成了测试环境,导致大量生产数据跑进测试环境,领导大发雷霆,而我临危受命。

解决方案

1.创建springboot工程
2.读取测试环境的亚马逊S3存储服务器的zip
3.修改zip里面的域名为生产环境
4.压缩zip上传至生产S3存储服务器

代码实现

1.连接S3存储服务器

/**
 * @Author nasus
 * @Date 2021/2/1
 * @Description
 */
@Component
@Slf4j
public class OssConn {

    public AmazonS3 conn(String accessKey,String secretKey,String endpoint){
        AmazonS3 amazonClient = null;
        try{
            AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
            ClientConfiguration clientConfig = new ClientConfiguration();
            clientConfig.setProtocol(Protocol.HTTP);
            amazonClient = new AmazonS3Client(credentials, clientConfig);
            amazonClient.setEndpoint(endpoint);
            amazonClient.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).disableChunkedEncoding().build());
            log.info("OSS-AmazonClient初始化:{}成功",endpoint);
        }catch (Exception e){
            e.getMessage();
            log.error("OSS-AmazonClient初始化失败",e);
            System.exit(0);
        }
        return amazonClient;
    }
}

2.建立与S3存储服务器连接读取压缩

    private Boolean readZipModifyText(String bizId, String id, String filePath, String fileName) {
        if (null == uatS3)
            uatS3 = ossConn.conn(uatAccessKey, uatSecretKey, uatEndpoint);
        if (null == prdS3)
            prdS3 = ossConn.conn(prdAccessKey, prdSecretKey, prdEndpoint);
        String zipText = "";
        ZipFile zipFile = null;
        try {
            S3Object object = uatS3.getObject(uatBucketName, filePath);
            BufferedInputStream inputStream = new BufferedInputStream(object.getObjectContent());
            //将InputStream对象转换成ByteArrayOutputStream
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) > -1 ) {
                byteArrayOutputStream.write(buffer, 0, len);
            }
            byteArrayOutputStream.flush();
            //将byteArrayOutputStream可转换成多个InputStream对象,达到多次读取InputStream效果
            InputStream inputStreamA = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            InputStream inputStreamB = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            inputStream.close();
            byteArrayOutputStream.close();
            //创建本地文件
            File file = new File(fileName);
            boolean newFile = file.createNewFile();
            if (!newFile) {
                log.error("id为:{}文件缓存本地失败", id);
                return false;
            }
            //读取出zip文件中的txt文本
            OutputStream outputStream = new FileOutputStream(file);
            int len2 = 0;
            byte[] buffer2 = new byte[8192];
            while ((len2 = inputStreamA.read(buffer2)) != -1) {
                outputStream.write(buffer2, 0, len2);
            }
            outputStream.close();
            inputStreamA.close();
            zipFile = new ZipFile(file);
            Charset gbk = Charset.forName("utf-8");
            ZipInputStream zin = new ZipInputStream(inputStreamB, gbk);
            inputStreamB.close();
            ZipEntry ze;
            while ((ze = zin.getNextEntry()) != null) {
                if (ze.isDirectory()) {
                } else {
                    System.err.println("file - " + ze.getName() + " : "
                            + ze.getSize() + " bytes");
                    long size = ze.getSize();
                    if (size > 0) {
                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(zipFile.getInputStream(ze)));
                        String line;
                        while ((line = br.readLine()) != null) {
                            //拿到zip中的txt内容
                            zipText = line;
                            //System.out.println(line);
                        }
                        br.close();
                    }
                }
                zin.closeEntry();
            }
            zin.close();
            zipFile.close();
            System.gc();
            Thread.sleep(100);
            //拿到txt文本内容后删除zip文件
            this.deleteFile(file);
            //替换txt中的文字
            zipText = zipText.replace("uatxxxx.com", "prdxxxx.com");

            //创建txt文本文件,写入替换后的文本内容
            BufferedReader bufferedReader = null;
            BufferedWriter bufferedWriter = null;
            File txtFile = new File(fileName.replace("zip", "txt"));
            boolean newTxtFile = txtFile.createNewFile();
            if (!newTxtFile) {
                log.error("id为:{}文件缓存本地失败", id);
                return false;
            }
            bufferedReader = new BufferedReader(new StringReader(zipText));
            bufferedWriter = new BufferedWriter(new FileWriter(txtFile));
            char buf[] = new char[1024];
            int len3;
            while ((len3 = bufferedReader.read(buf)) != -1) {
                bufferedWriter.write(buf, 0, len3);
            }
            bufferedWriter.flush();
            bufferedReader.close();
            bufferedWriter.close();

            //压缩txt文本
            ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(fileName));
            outZip.putNextEntry(new ZipEntry(fileName.replace("zip", "txt")));
            FileInputStream inZip = new FileInputStream(txtFile);
            int b;
            while ((b = inZip.read())!= -1){
                outZip.write(b);
            }
            inZip.close();
            outZip.close();
            //压缩完后删除txt文件
            this.deleteFile(txtFile);
            //拿到zip文件
            File prdZipFile = new File(fileName);
            //上传zip至存储服务器
            prdS3.putObject(prdBucketName, filePath, prdZipFile);
            if (prdS3.doesObjectExist(prdBucketName, filePath)) {
                log.info("bizId为:{},记录id为:{}文件上传成功", bizId, id);
            } else {
                log.info("bizId为:{},记录id为:{}文件上传后查询为空,上传失败", bizId, id);
            }
            //删除zip文件
            this.deleteFile(prdZipFile);

        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行异常:{}", e.getMessage());
            return false;
        } finally {
        }
        return true;
    }

3.删除File方法

    public void deleteFile(File file) throws Exception{
        if (file.exists()){
            try {
                FileUtils.forceDelete(file);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

整个迁移的工程还包括了乱七八糟的业务代码,这里主要贴一下读取zip文件txt及解压txt为zip的过程。

                  船停泊在港湾里非常安全,但那不是造船的目的。 --超级大帅安
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值