The class ``++java.util.zip.GZIPInputStream++`` is already buffering its input while reading. Thus passing a ``++java.io.BufferedInputStream++`` to a ``++java.util.zip.GZIPInputStream++`` is redundant. It is more efficient to directly pass the original input stream to ``++java.util.zip.GZIPInputStream++``.


Note that the default buffer size of ``++GZIPInputStream++`` is not the same as the one in ``++BufferedInputStream++``. Configure it if need be.


This rule raises an issue when a ``++java.util.zip.GZIPInputStream++`` reads from a ``++java.io.BufferedInputStream++``.


== Noncompliant Code Example

[source,java]
----
import java.io.*;
import java.util.zip.GZIPInputStream;

public class Noncompliant {

    void deflateFile(final File file) throws IOException {
        try (
            FileInputStream fileStream = new FileInputStream(file);
            BufferedInputStream bufferedStream = new BufferedInputStream(fileStream);
            InputStream input = new GZIPInputStream(bufferedStream); // Noncompliant
        ) {
            // process the input
        }
    }
}
----


== Compliant Solution

[source,java]
----
import java.io.*;
import java.util.zip.GZIPInputStream;
public class Compliant {

    void deflateFile(final File file) throws IOException {
        try (
            FileInputStream fileStream = new FileInputStream(file);
            InputStream input = new GZIPInputStream(fileStream);
        ) {
            // process the input
        }
    }
}
----


== See

* Stackoverflow question about usage of GZIPInputStream and the BufferedInputStream - https://stackoverflow.com/questions/4438085/seeking-out-the-optimum-size-for-bufferedinputstream-in-java/4438217#4438217[GZIPInputStream and the BufferedInputStream]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::message.adoc[]

include::highlighting.adoc[]

'''
== Comments And Links
(visible only on this page)

include::comments-and-links.adoc[]
endif::env-github,rspecator-view[]
