在Java中压缩用于客户端/服务器传输的字符串

fil*_*lsa 1 java compression string

我使用专有的客户端/服务器消息格式来限制我可以通过网络发送的内容.我无法发送序列化对象,我必须将消息中的数据存储为String.我发送的数据是以逗号分隔的大值,我想在将数据打包为消息之前压缩数据.

我尝试使用Deflater/Inflater实现这一目标,但是在某个地方,我遇到了困难.

我正在使用以下两种方法进行放气/充气.但是,将compressString()方法的结果传递给decompressStringMethod()会返回null结果.

public String compressString(String data) {
  Deflater deflater = new Deflater();
  byte[] target = new byte[100];
  try {
   deflater.setInput(data.getBytes(UTF8_CHARSET));
   deflater.finish();
   int deflateLength = deflater.deflate(target);
   return new String(target);
  } catch (UnsupportedEncodingException e) {
   //TODO
  }

  return data;
 }

 public String decompressString(String data) {

  String result = null;
  try {
   byte[] input = data.getBytes();

   Inflater inflater = new Inflater();
   int inputLength = input.length;
   inflater.setInput(input, 0, inputLength);

   byte[] output = new byte[100];
   int resultLength = inflater.inflate(output);
   inflater.end();

   result = new String(output, 0, resultLength, UTF8_CHARSET);
  } catch (DataFormatException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

  return result;
 }
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 11

据我所知,您目前的做法是:

  1. 使用将字符串转换为字节数组getBytes("UTF-8").
  2. 压缩字节数组
  3. 使用压缩字节数组转换为String new String(bytes, ..., "UTF-8").
  4. 传输压缩字符串
  5. 接收压缩字符串
  6. 使用压缩字符串转换为字节数组getBytes("UTF-8").
  7. 解压缩字节数组
  8. 使用解压缩的字节数组转换为String new String(bytes, ..., "UTF-8").

这种方法的问题在于步骤3.压缩字节数组时,您创建的字节序列可能不再是有效的UTF-8.结果将是步骤3中的例外.

解决方案是使用像Base64这样的"字节到字符"编码方案将压缩字节转换为可传输的字符串.换句话说,用调用Base64编码函数代替步骤3,用调用Base64解码函数代替步骤6.

笔记:

  1. 对于小字符串,压缩和编码实际上可能会增加传输字符串的大小.
  2. 如果压缩的String将要合并到URL中,您可能希望为Base64选择不同的编码,以避免需要进行URL转义的字符.
  3. 根据您传输的数据的性质,您可能会发现特定于域的压缩比通用压缩更好.考虑在创建以逗号分隔的字符串之前压缩数据.考虑以逗号分隔的字符串的替代方法.