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

2024-04-30

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

我尝试使用 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;
 }

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

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

此方法的问题在于步骤 3。压缩字节数组时,您创建的字节序列可能不再是有效的 UTF-8。结果将在步骤 3 中出现异常。

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

Notes:

  1. 对于小字符串,压缩和 编码实际上可能是 增加传输字符串的大小。
  2. 如果压缩的字符串要合并到 URL 中,您可能需要选择与 Base64 不同的编码,以避免需要 URL 转义的字符。
  3. 根据您传输的数据的性质,您可能会发现特定于域的压缩比通用压缩效果更好。在创建逗号分隔的字符串之前考虑压缩数据。考虑逗号分隔字符串的替代方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中客户端/服务器传输的压缩字符串 的相关文章

随机推荐