首页 > 其他分享 >Gzip压缩文件和压缩字符串,web接口应用

Gzip压缩文件和压缩字符串,web接口应用

时间:2024-11-20 19:34:50浏览次数:1  
标签:web java String 压缩文件 new Gzip import byte out

Gzip压缩文件和压缩字符串,web接口应用

1.压缩文件

package com.example.core.mydemo.gzip;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
 * 压缩文件
 */
public class GzipUtil {

    public static void compressFile(String sourceFile, String compressedFile) {
        try {
            FileInputStream fis = new FileInputStream(sourceFile);
            FileOutputStream fos = new FileOutputStream(compressedFile);
            GZIPOutputStream gzos = new GZIPOutputStream(fos);

            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                gzos.write(buffer, 0, len);
            }

            gzos.finish();
            gzos.close();
            fos.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void decompressFile(String compressedFile, String decompressedFile) {
        try {
            FileInputStream fis = new FileInputStream(compressedFile);
            FileOutputStream fos = new FileOutputStream(decompressedFile);
            GZIPInputStream gzis = new GZIPInputStream(fis);

            byte[] buffer = new byte[1024];
            int len;
            while ((len = gzis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }

            gzis.close();
            fos.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


package com.example.core.mydemo.gzip;

public class GzipUtilExample {
    public static void main(String[] args) {
        // 压缩文件
        String sourceFile = "F:\\scooterOrderCommon241021.log";
        String compressedFile = "F:\\compressed2.gz";
        GzipUtil.compressFile(sourceFile, compressedFile);

        // 解压缩文件
        String decompressedFile = "F:\\decompressed2.txt";
        GzipUtil.decompressFile(compressedFile, decompressedFile);
    }

}

2.压缩字符串

package com.example.core.mydemo.gzip;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
 * gzip字符串压缩的使用
 * 使用gzip对字符串进行压缩可以帮助我们在网络传输、文件压缩等场景中减小数据体积,提高传输效率。在实际应用中,我们可以将压缩后的字节数组进行传输或保存到文件中,然后在需要时解压缩并恢复原始字符串。
 *
 * output:
 Compressed string size before: 200
 Compressed string size after: 72
 byte转字符串(字节大小): 146
 byte转字符串=       �H����Q(��,V �D�����⒢̼t���"�������܂������<=�A� �����
 解压缩字符串=java.io.ByteArrayInputStream@65b3120a
 compressed addr=[B@6f539caf
 compressed2 addr=[B@79fc0f2f
 解压缩字符串2=Hello, this is a test string for gzip compression.Hello, this is a test string for gzip compression.Hello, this is a test string for gzip compression.Hello, this is a test string for gzip compression.
 res=abcd
 */
public class GzipHelper {

    /**
     * 压缩方法
     * @param input
     * @return
     * @throws IOException
     */
    public static byte[] compressString(String input) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(bos);
        gzip.write(input.getBytes());
        gzip.flush();
        gzip.close();
        return bos.toByteArray();
    }

    private static StringBuffer unCompressed(byte[] compressed2) throws IOException {
        /**
         * 解压缩 - 正解
         */
        InputStream in = new ByteArrayInputStream(compressed2);
        GZIPInputStream gzin = new GZIPInputStream(in);
        BufferedReader reader = new BufferedReader(new InputStreamReader(gzin,"UTF-8"));
        String line;
        StringBuffer sb = new StringBuffer();
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        reader.close();
        return sb;
    }

    public static void main(String[] args) throws IOException {
        String input = "Hello, this is a test string for gzip compression.Hello, this is a test string for gzip compression.Hello, this is a test string for gzip compression.Hello, this is a test string for gzip compression.";
        System.out.println("Compressed string size before: " + input.getBytes().length);
        byte[] compressed = compressString(input);
        System.out.println("Compressed string size after: " + compressed.length);

        //byte转字符串   >> 输出错误 不能通过这种方式转字符串,需要解压缩的方式来处理。
        String ss = new String(compressed, StandardCharsets.UTF_8);
        System.out.println("byte转字符串(字节大小): " + ss.getBytes().length);
        System.out.println("byte转字符串=" + ss);  //输出错误

//        byte[] compressed2 = compressed;  //会报错:Exception in thread "main" java.util.zip.ZipException: Not in GZIP format
        //需要克隆对象,使用同一个对象会报错。 解决以上报错
        byte[] compressed2 = compressed.clone();

        //压缩接口传输
        //gzip压缩的逆运算
        ByteArrayInputStream ios = new ByteArrayInputStream(compressed);
        GZIPInputStream gzip = new GZIPInputStream(ios);
        gzip.read(compressed);
        gzip.close();
        String ss2 = ios.toString();
        ios.close();
        System.out.println("解压缩字符串=" + ss2);

        //Exception in thread "main" java.util.zip.ZipException: Not in GZIP format
        /**
         * 报错:"Not in GZIP format" 通常出现在处理压缩文件时,尤其是在解压GZIP格式的文件时。这个错误表明你尝试解压的文件并不是有效的GZIP格式,可能是因为文件已损坏、不完整或者根本不是GZIP压缩过的。
         * 打印出来是2个地址
         */
        System.out.println("compressed addr=" + compressed.toString());
        System.out.println("compressed2 addr=" + compressed2.toString());

        StringBuffer sb = unCompressed(compressed2);
        System.out.println("解压缩字符串2=" + sb);


        //普通字符串与byte转换,以上是gzip压缩的字符串与byte转换。
        String str = "abcd";
        byte[] bs = str.getBytes();
        String res = new String(bs,"UTF-8");
        System.out.println("res=" + res);

    }
}

3.web应用demo

import com.test.commons.utils.GsonUtils;
import com.test.commons.web.ErrorCode;
import com.test.insurancedock.service.EhCacheService;
import com.test.insurancedock.vo.req.UserVo;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

@RestController
@RequestMapping("/gzip")
@lombok.extern.slf4j.Slf4j
public class GzipController {
    @Autowired
    private EhCacheService ehCacheService;

    private static final String ENCODING_UTF8 = "UTF-8";
    protected static ObjectMapper mapper = new ObjectMapper();

    /**
     * 方法返回类型:void
     * @param request
     * @param response
     */
    @PostMapping("/saveUser")
    public void saveUser(HttpServletRequest request, HttpServletResponse response) {
        BufferedReader reader = null;
        try {
            long start = System.currentTimeMillis();
            log.info("添加开始:" + start);
            GZIPInputStream gzipIn = new GZIPInputStream(request.getInputStream());
            reader = new BufferedReader(new InputStreamReader(gzipIn,"UTF-8"));
            String reqContent = reader.readLine();
            UserVo userVo = null;
            if(StringUtils.hasText(reqContent)){
                userVo = mapper.readValue(reqContent,UserVo.class);
            }
            log.info("接收到的参数值:" + GsonUtils.toJson(userVo));
            String res = ehCacheService.updateUser(userVo.getId(),userVo.getName());
            System.out.println("添加成功的记录=" + res);
            long end = System.currentTimeMillis();
            log.info("添加结束:" + end);
            log.info("添加耗时:" + (end - start));

            writeResponse(response, "json串返回成功");
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(reader != null){
                try {
                    reader.close();
                } catch (Exception e) {
                    log.error("",e);
                }
            }
        }
        writeResponse(response, "json串返回失败");
    }

    protected void writeResponse(HttpServletResponse response, Object outJB){
//        response.setContentType("text/html; charset=utf-8");
        response.setContentType("application/json; charset=utf-8");
        //response.setContentType("text/json; charset=utf-8");
        response.setCharacterEncoding(ENCODING_UTF8);
        response.setHeader("Content-Encoding", "gzip");
        GZIPOutputStream out = null;
        //byte[] jsonOut = null;
        log.info("response start.");
        String jsonOut = null;
        try {
            jsonOut = mapper.writeValueAsString(outJB);
            out = new GZIPOutputStream(response.getOutputStream());
            out.write(jsonOut.getBytes(ENCODING_UTF8));
            out.flush();
        } catch (Exception e) {
            log.error("output error",e);
        } finally{
            if(out != null){
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}


//单元测试类:
package com.test.insurancedock;

import org.junit.Test;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;


public class GzipTest {
    
    private static final String reqUrl = "http://localhost:1340/";

    @Test
    public void testGzip() {
        String url = "gzip/saveUser";

        // 获取TN码
        String strReq = "{\"id\":\"10\",\"name\":\"zhangliao\"}";
        try {
            String result = appPost(strReq, reqUrl + url);
            System.err.println("接口调用返回结果:" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
     /* 
     * @param str   json数据格式
     * @param reqUrl
     */
    public static String appPost(String str, String reqUrl) throws Exception{
        //发送数据
        HttpURLConnection conn = null;
        StringBuffer sb = new StringBuffer();
        try {
            URL url = new URL(reqUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setInstanceFollowRedirects(false);//是否自动处理重定向
            conn.setRequestMethod("POST");
            conn.setRequestProperty("User-Agent", "no");
            conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
            conn.connect();
            GZIPOutputStream out = new GZIPOutputStream(conn.getOutputStream());
            byte[] reqContent = str.getBytes();
            System.out.println("testPost发送内容:"+new String(reqContent,"UTF-8"));
            out.write(reqContent);
            out.flush();
            out.close();
            
            //接收返回数据
            InputStream in = conn.getInputStream();
            GZIPInputStream gzin = new GZIPInputStream(in);
            BufferedReader reader = new BufferedReader(new InputStreamReader(gzin,"UTF-8"));
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            reader.close();
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            if(conn != null){
                conn.disconnect();
            }
        }
        return sb.toString();
    }
    
}

打印输出:
testPost发送内容:{"id":"10","name":"zhangliao"}
接口调用返回结果:"json串返回成功"

标签:web,java,String,压缩文件,new,Gzip,import,byte,out
From: https://www.cnblogs.com/oktokeep/p/18559049

相关文章

  • web网络安全系统
    最近了解了基于web的网络安全系统的设计与实现项目,在这个平台记录一下这个基于web的网络安全系统的设计与实现项目,方便以后再次使用或学习的时候能够及时的翻阅。在完成基于web的网络安全系统的设计与实现项目的时候,考虑了很多框架。最终决定选用SSM(MYECLIPSE),该框架具有极强......
  • Java Web实现用户登录
    JavaWeb实现用户登录        大型网站只有在用户登录成功后才能进行相关操作,本任务要求实现一个如下图所示用户登录功能。用户登录时,需要在数据库中判断是否存在该用户的信息以及用户信息的正确性。用户登录界面如下图所示。实现步骤 1、创建数据库表2、Web项......
  • WebFlux (承接之前说的响应式编程方面)
    SpringWebFlux是SpringFramework5.0引入的一个全新的响应式框架,专为支持响应式编程而设计,主要目标是使开发者能够构建异步、非阻塞、事件驱动的Web应用程序。它与SpringMVC共存,但使用了完全不同的异步核心技术。是为了满足现代系统在处理大量并发连接及高吞吐量所需的响应......
  • 前端游戏网站【GAME】大学生web期末大作业 html+css+js
    目录1.项目介绍2项目展示3.代码部分4.联系我 1.项目介绍这是大一时候写的一个前端游戏网站,包括了火影忍者,原神,蛋仔派对(没有写完),英雄联盟(没有写完),现在才想起来有怎么一个项目可以分享出来可以练练手。2项目展示前面使用html+css+js:Div、导航栏、图片轮翻效果、视频......
  • webapi调用
    一、查询即时库存内容  client=K3CloudApiClient("https://suninfinit.ik3cloud.com/K3Cloud/");  loginResult=client.ValidateLogin("1361434108470788096","王传志","1qaz@WSX3edc",2052);    resultType=JObject.Parse(logi......
  • Nuxt.js 应用中的 webpackConfigs 事件钩子
    title:Nuxt.js应用中的webpackConfigs事件钩子date:2024/11/20updated:2024/11/20author:cmdragonexcerpt:在Nuxt.js项目中,webpack:config钩子允许运行时对Webpack配置进行修改。此钩子在配置Webpack编译器之前被调用,使得开发者能根据需要定制和扩展Webpac......
  • javaweb学习 day4 JavaScript
    JavaScript主要负责网页的行为(交互交过)js引入方式内部脚本:将JS代码定义在HTML页面中1.JS代码必须位于标签之中2.在HTML文档中,常见事件://onload:页面/元素加载完成后触发functionload(){console.log("页面加载完成...")}//onclick:鼠标点击事件functionfn1(){......
  • 11.19[JAVA-WEB]打通JAVA前后端-JSP
    JAVA网页开发(涉及服务器)结构是什么?代码逻辑是怎样的?JAVA网页开发(涉及服务器)结构是什么?代码逻辑是怎样的?(不使用spring框架)•HTML、CSS和JavaScript运行在浏览器中,称为前端脚本•服务器端脚本是运行在服务器上,动态生成网页(HTML、CSS和JavaScript)的程序。•常见服务器......
  • 蓝易云 - 使用Debian、Docker和Nginx部署Web应用教程
    在Debian上使用Docker和Nginx部署Web应用是一种常见的配置方式。下面是一个简单的教程:安装Docker:在Debian上安装Docker,运行以下命令:apt-getupdateapt-getinstall-yapt-transport-httpsca-certificatescurlgnupglsb-releasecurl-fsSLhttps://download.docker.co......
  • 用Python编写一个websocket客户端应用
    前两天发了一篇《用Python做一个websocket服务端》,起了一个websocket服务。然后又发了一篇《用jquery做一个websocket客户端》,这是直接在网页中验证websocket服务是否有效。但是,对于客户端怎么实际应用websocket并没有涉及。作为一个轻微强迫症者,我觉得还是要再捣鼓一下websock......