blog

Javaで圧縮/解凍された文字列

Javaには、Compressionライブラリを使用した通常の圧縮のためのDeflaterクラスが用意されています。また、Deflaterクラスを使用してデータストリームを圧縮し、圧縮されたデータを別...

Jul 9, 2020 · 2 min. read
シェア

Javaには、Compression Libraryを使用して通常の圧縮を行うためのDeflaterクラスが用意されています。DeflaterOutputStreamまた、Deflater クラスを使用してデータ・ストリームを圧縮してフィルタリングし、圧縮されたデータを別の出力ストリームに書き出すこともできます。InflaterOutputStream解凍を処理するために、同等のInflaterとクラスがあります。

圧縮

DeflatorOutputStreamこれは、.NET Frameworkを使ってバイト配列を圧縮する方法の例です。

 /**
 * 圧縮された文字列、デフォルトはcomb utf-8
 *
 * @param text
 * @return
 */
 public static String zipBase64(String text) {
 try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
 try (DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(out)) {
 deflaterOutputStream.write(text.getBytes(Constant.UTF_8));
 }
 return new String(DecodeEncode.base64Encode(out.toByteArray()));
 } catch (IOException e) {
 logger.error("テキストの圧縮に失敗した:{}", text, e);
 }
 return EMPTY;
 }

テストしてみましょう:

 public static void main(String[] args) throws IOException {
 String text = DecodeEncode.zipBase64("5615616119688refdaf888888888888888865555555555555511111111111111111111111119999999999999999999999999999999911111111111111111111333333333333333333");
 output(text);
 String s = DecodeEncode.unzipBase64(text);
 output(s);
 output(text.length() + TAB + s.length());
 }

コンソール出力:

INFO-> eJwzNTM0NTM0MzS0NLOwKEpNS0lMs0ADZqYowBAXsCQAsOkxxgAALV0fBw==
INFO-> 5615616119688refdaf888888888888888865555555555555511111111111111111111111119999999999999999999999999999999911111111111111111111333333333333333333
INFO-> 60	145

解凍

 /**
 * 非圧縮文字列、デフォルトutf-8
 *
 * @param text
 * @return
 */
 public static String unzipBase64(String text) {
 try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
 try (OutputStream outputStream = new InflaterOutputStream(os)) {
 outputStream.write(DecodeEncode.base64Byte(text));
 }
 return new String(os.toByteArray(), Constant.UTF_8);
 } catch (IOException e) {
 logger.error("テキストの解凍に失敗した:{}", text, e);
 }
 return EMPTY;
 }

テストしてみましょう:

 public static void main(String[] args) throws IOException {
 String text = "eJwzNTM0NTM0MzS0NLOwKEpNS0lMs0ADZqYowBAXsCQAsOkxxgAALV0fBw==";
 String s = DecodeEncode.unzipBase64(text);
 output(s);
 output(text.length() + TAB + s.length());
 }

コンソール出力:


INFO-> 現在のユーザー:fv、IP:2.21,作業ディレクトリ:/Users/fv/Documents/workspace/fun/,システム・コーディング・フォーマット:UTF-8,システム Mac OS X バージョン:
INFO-> 5615616119688refdaf888888888888888865555555555555511111111111111111111111119999999999999999999999999999999911111111111111111111333333333333333333
INFO-> 60	145

テストケース

ここではspockテストフレームワークを使って、圧縮された文字列の長さと圧縮前の長さを検証しています。

テスト結果


そのうちの2つは合格しませんでしたが、私はデジタルエフェクトのストレージのためにこの圧縮が良くなることを感じたり、バイト[]に対処するために使用する方が良いでしょう。オンラインでは、主にファイルを圧縮するために使用されるいくつかの情報を参照するには、いくつかの良いように見えますが、私はテリアを考えてみましょう:圧縮ファイルのサイズは、圧縮前よりも大きくなります。

    Read next

    jQueryラップDOMライブラリ

    オブジェクトと一緒に呼び出される関数は、その関数の中のthisがその前にあるのと同じオブジェクトになります。例

    Jul 9, 2020 · 8 min read