Java OutputStream Write String writeStringCompressed(ByteArrayOutputStream baos, String s)

Here you can find the source of writeStringCompressed(ByteArrayOutputStream baos, String s)

Description

write String Compressed

License

Open Source License

Declaration

public static void writeStringCompressed(ByteArrayOutputStream baos, String s) 

Method Source Code

//package com.java2s;
//* Licensed Materials - Property of IBM, Miracle A/S, and            *

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import java.util.zip.GZIPOutputStream;

public class Main {
    public static void writeStringCompressed(ByteArrayOutputStream baos, String s) {
        try {//from   w w w  .  j  a va2  s  .  c o m
            writeCompressedData(baos, s.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("Cannot write string", e);
        }
    }

    public static void writeCompressedData(ByteArrayOutputStream baos, byte[] data) {
        byte[] compressed = getCompressedData(data);
        writeLength(baos, data.length);
        writeData(baos, compressed);
    }

    static byte[] getCompressedData(byte[] data) {
        ByteArrayOutputStream ser = new ByteArrayOutputStream();
        GZIPOutputStream gs;
        try {
            gs = new GZIPOutputStream(ser);
            gs.write(data);
            gs.close();
        } catch (IOException e) {
            throw new RuntimeException("Cannot compress data", e);
        }

        byte[] compressed = ser.toByteArray();
        return compressed;
    }

    public static void writeLength(ByteArrayOutputStream baos, int len) {
        if (len < 0) {
            throw new RuntimeException("Invalid length < 0");
        }
        if (len <= 127) {
            //MSB = 0
            baos.write(len);
        } else if (len <= 16383) {
            // MSB = 10
            int lowbyte = len % 64;
            int highbyte = len / 64;
            baos.write(lowbyte + 128);
            baos.write(highbyte);
        } else if (len <= 2097151) {
            // MSB = 110
            int lowbyte = len % 32;
            int midbyte = (len / 32) % 256;
            int highbyte = len / 32 / 256;
            baos.write(lowbyte + 128 + 64);
            baos.write(midbyte);
            baos.write(highbyte);
        } else {
            throw new RuntimeException("Invalid length > 2^21-1");
        }
    }

    public static void writeData(ByteArrayOutputStream baos, byte[] data) {
        writeLength(baos, data.length);
        baos.write(data, 0, data.length);
    }
}

Related

  1. writeString(String data, int length, OutputStream out)
  2. writeString(String s, OutputStream out)
  3. writeString(String str, ObjectOutputStream dos)
  4. writeString(String value, OutputStream os)
  5. writeStringAsAsciiBytes(String in, OutputStream out)
  6. writeStringKey(final Object key, final ObjectOutputStream oos)
  7. writeStringKey(final Object key, final ObjectOutputStream oos)
  8. writeStringMap(ObjectOutputStream out, Map map)
  9. writeStringSmart(ByteArrayOutputStream baos, String s, Map knownStrings)