如何将字符串转换为GZIP Base64字符串?

14

我一直在试图理解如何使用 GZIPOutputStream等内容,但是没有成功理解它们。我想做的就是将一个字符串 "A string of characters" 转换为 GZIP Base64 格式。我该如何实现?

所谓 GZIP Base64 格式,是指先使用 GZIP 压缩字符串,然后将其转换为Base64格式。


1
请查看这个问题 - froderik
3个回答

29
使用Apache Commons Codec中的Base64OutputStream。这里是一个示例类:
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.Base64OutputStream;

public class Test {
    public static void main(String[] args) {
        String text = "a string of characters";
        try {
            Base64OutputStream b64os = new Base64OutputStream(System.out);
            GZIPOutputStream gzip = new GZIPOutputStream(b64os);
            gzip.write(text.getBytes("UTF-8"));
            gzip.close();
            b64os.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

这将输出:

H4sIAAAAAAAAAEtUKC4pysxLV8hPU0jOSCxKTC5JLSoGAOP+cfkWAAAA

在Linux下,您可以通过以下方式确认此操作有效:
echo 'H4sIAAAAAAAAAEtUKC4pysxLV8hPU0jOSCxKTC5JLSoGAOP+cfkWAAAA' | base64 -d | gunzip

请注意,在OSX上,您应该使用base64 -D而不是上述命令中的base64 -d
输出结果如下:
a string of characters

只是一个小提示,base64解码使用-D选项。-d选项用于启用调试日志记录。 - Brandon Pelfrey
1
感谢您的评论@BrandonPelfrey。您使用的是Mac OS X吗?在Linux上,GNU Coreutils“base64”命令接受“-d”选项进行解码。在Apple Mac OS X,“base64”命令接受“-D”选项进行解码。 - Go Dan

1

Java 9

示例:

public static void main(String[] args) throws IOException {
    byte[] original = "string".getBytes(StandardCharsets.UTF_8);

    // encode
    byte[] gzipToBase64 = encodeToBase64(encodeToGZIP(original));
    System.out.println(new String(gzipToBase64));
    //H4sIAAAAAAAAACsuKcrMSwcAqbK+ngYAAAA=

    // decode
    byte[] fromBase64Gzip = decodeFromGZIP(decodeFromBase64(gzipToBase64));
    System.out.println(Arrays.equals(original, fromBase64Gzip)); //true
}

public static byte[] decodeFromBase64(byte[] arr) {
    return Base64.getDecoder().decode(arr);
}

public static byte[] encodeToBase64(byte[] arr) {
    return Base64.getEncoder().encode(arr);
}

public static byte[] decodeFromGZIP(byte[] arr) throws IOException {
    ByteArrayInputStream bais = new ByteArrayInputStream(arr);
    GZIPInputStream gzip = new GZIPInputStream(bais);
    return gzip.readAllBytes();
}

public static byte[] encodeToGZIP(byte[] arr) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    GZIPOutputStream gzip = new GZIPOutputStream(baos);
    gzip.write(arr);
    gzip.finish();
    return baos.toByteArray();
}

另请参阅:在Java中将编码作为Base64


0

这是 此答案 的变体,但没有过时的内容,并使用 Vavr Try

public static Try<String> compress(String input) {
  return Try.of(() -> {
    ByteArrayOutputStream rstBao = new ByteArrayOutputStream();
    GZIPOutputStream zos = new GZIPOutputStream(rstBao);
    zos.write(input.getBytes(StandardCharsets.UTF_8));
    zos.close();
    return Base64.encodeBase64String(rstBao.toByteArray());
   });

public static Try<String> decompress(String input) {
  return Try.of(() -> IOUtils.toString(new GZIPInputStream(
    new ByteArrayInputStream(Base64.decodeBase64(input))),        
      StandardCharsets.UTF_8));
  }
}

// unit test
@Test
public void testStringCompression() {
  var data = "I finally rest. And watch the sun rise on a grateful universe. The hardest choices require the strongest wills.";
  var cs = Utilities.compress(data);
  assertThat(cs.isSuccess());
  var us = Utilities.decompress(cs.get());
  assertThat(us.isSuccess() && us.get().equals(data));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接