gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:46:36 25 4
gpt4 key购买 nike

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

我试图使用 Deflater/Inflater 来实现这一点,但在某处我遇到了困难。

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

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 解码函数的调用。

注意事项:

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

关于java - 在 Java 中压缩用于客户端/服务器传输的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1414037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com