在Java中使用Snappy将字符串解压缩为字符串
我试图压缩在Java中使用Snappy将字符串解压缩为字符串,java,snappy,Java,Snappy,我试图压缩字符串,将它们写入文件(作为字符串)并解压缩这些文件。 为了压缩,我编写了以下函数: public static String compress(String s) throws IOException { byte[] by = Snappy.compress(s, StandardCharsets.UTF_8); return new String(by, StandardCharsets.UTF_8); } 然后,对于解压缩 public static Stri
字符串
,将它们写入文件(作为字符串
)并解压缩这些文件。
为了压缩,我编写了以下函数:
public static String compress(String s) throws IOException {
byte[] by = Snappy.compress(s, StandardCharsets.UTF_8);
return new String(by, StandardCharsets.UTF_8);
}
然后,对于解压缩
public static String uncompress(String s) throws IOException {
byte[] by = s.getBytes(StandardCharsets.UTF_8);
return Snappy.uncompressString(by, StandardCharsets.UTF_8);
}
但是我得到的解压失败(5)
,通过查看数据,snapy.compress(s,StandardCharsets.UTF_8)
与将getBytes(StandardCharsets.UTF_8)
应用到使用compress
函数压缩的数据时,不会得到相同的结果。
你知道为什么吗?我如何压缩和解压到
字符串
?谢谢 压缩结果以字节为单位,您需要将其存储为字节,直到再次解压缩。无法将压缩的字节转换回字符串
(字节[]
甚至可能不包含有效的UTF-8)
现在您要问“但是如何将压缩的
字符串保存到文件中?”。嗯,你要把它保存到一个二进制文件中,也就是说,写字节而不是字符串。这意味着您无法在记事本中编辑该文件,甚至无法查看该文件(当然可以,但它会乱七八糟)。这确实有效,请使用Base64.getEncoder()
和Base64.getDecoder()
尽管snappy使用的字节空间比Base64字符串小。
另外,编码/解码增加了约45%的性能和不必要的开销,snappy正试图降低这些性能和开销。为什么要将结果存储在压缩方法中的字符串
对象中?字符串不适合存储任意字节。使压缩
方法返回字节[]
而不是字符串
,并使解压缩
方法将字节[]
作为参数,而不是字符串
。如果您真的需要将字节存储在字符串中,那么您必须使用类似于base64编码的方法。
BitShuffle.unshuffleIntArray(Snappy.uncompress(Base64.getDecoder().decode(new String(Base64.getEncoder().encode(Snappy.compress(BitShuffle.shuffle(new int[]{1, 2, 3})))))));