我使用专有的客户端/服务器消息格式来限制我可以通过网络发送的内容.我无法发送序列化对象,我必须将消息中的数据存储为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;
}
解决方法:
据我所知,您目前的做法是:
>使用getBytes(“UTF-8”)将String转换为字节数组.
>压缩字节数组
>使用新的String(字节,…,“UTF-8”)将压缩字节数组转换为String.
>传输压缩字符串
>接收压缩字符串
>使用getBytes(“UTF-8”)将压缩字符串转换为字节数组.
>解压缩字节数组
>使用新的String(bytes,…,“UTF-8”)将解压缩的字节数组转换为String.
这种方法的问题在于步骤3.压缩字节数组时,您创建的字节序列可能不再是有效的UTF-8.结果将是步骤3中的例外.
解决方案是使用像Base64这样的“字节到字符”编码方案将压缩字节转换为可传输的字符串.换句话说,用调用Base64编码函数代替步骤3,用调用Base64解码函数代替步骤6.
笔记:
>对于小弦,压缩和
编码很可能实际上
增加传输字符串的大小.
>如果要将压缩的字符串合并到URL中,您可能希望为Base64选择不同的编码,以避免需要进行URL转义的字符.
>根据您传输的数据的性质,您可能会发现特定于域的压缩比通用压缩更好.考虑在创建以逗号分隔的字符串之前压缩数据.考虑以逗号分隔的字符串的替代方法.