6

私は次のような方法を持っています

      public void put(@Nonnull final InputStream inputStream, @Nonnull final String uniqueId) throws PersistenceException {
        // a.) create gzip of inputStream
        final GZIPInputStream zipInputStream;
        try {
            zipInputStream = new GZIPInputStream(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
            throw new PersistenceException("Persistence Service could not received input stream to persist for " + uniqueId);
        }

を に変換しinputStreamたいのzipInputStreamですが、その方法は何ですか?

  • 上記の方法は正しくなく、「Not a Zip Format」として例外をスローします

Java Streams を私に変換するのは本当に混乱し、私はそれらを正しくしません

4

2 に答える 2

11

は、着信を解凍GZIPInputStreamするために使用されます。GZIPを使用して着信を圧縮するには、基本的にそれをに書き込む必要があります。InputStreamInputStreamGZIPOutputStream

gzipで圧縮されたコンテンツをに書き込み、をに変換するために使用すると、InputStream新しいコンテンツを取得できます。ByteArrayOutputStreambyte[]ByteArrayInputStreambyte[]InputStream

だから基本的に:

public void put(@Nonnull final InputStream inputStream, @Nonnull final String uniqueId) throws PersistenceException {
    final InputStream zipInputStream;
    try {
        ByteArrayOutputStream bytesOutput = new ByteArrayOutputStream();
        GZIPOutputStream gzipOutput = new GZIPOutputStream(bytesOutput);

        try {
            byte[] buffer = new byte[10240];
            for (int length = 0; (length = inputStream.read(buffer)) != -1;) {
                gzipOutput.write(buffer, 0, length);
            }
        } finally {
            try { inputStream.close(); } catch (IOException ignore) {}
            try { gzipOutput.close(); } catch (IOException ignore) {}
        }

        zipInputStream = new ByteArrayInputStream(bytesOutput.toByteArray());
    } catch (IOException e) {
        e.printStackTrace();
        throw new PersistenceException("Persistence Service could not received input stream to persist for " + uniqueId);
    }

    // ...

必要に応じて、によって作成された一時ファイルの/をByteArrayOutputStream/に置き換えることができます。特に、これらのストリームに大きなデータが含まれている可能性がある場合は、同時に使用するとマシンの使用可能なメモリがオーバーフローする可能性があります。ByteArrayInputStreamFileOuputStreamFileInputStreamFile#createTempFile()

于 2012-09-07T16:42:46.933 に答える
5

GZIPInputStreamは、gzip エンコードのコンテンツを読み取るためのものです。

通常の入力ストリームを取得して GZIP 形式で圧縮することが目標の場合は、それらのバイトをGZIPOutputStreamに書き込む必要があります。

関連する質問へのこの回答も参照してください。

于 2012-09-07T16:36:26.803 に答える