## Why is this an issue?

When directly subclassing `java.io.InputStream` or `java.io.FilterInputStream`, the only requirement is that you implement the method `read()`. However most uses for such streams don’t read a single byte at a time and the default implementation for `read(byte[],int,int)` will call `read(int)` for every single byte in the array which can create a lot of overhead and is utterly inefficient. It is therefore strongly recommended that subclasses provide an efficient implementation of `read(byte[],int,int)`.

This rule raises an issue when a direct subclass of `java.io.InputStream` or `java.io.FilterInputStream` doesn’t provide an override of `read(byte[],int,int)`.

### Noncompliant code example

    public class MyInputStream extends java.io.InputStream {
      private FileInputStream fin;

      public MyInputStream(File file) throws IOException {
        fin = new FileInputStream(file);
      }

      @Override
      public int read() throws IOException {
        return fin.read();
      }
    }

### Compliant solution

    public class MyInputStream extends java.io.InputStream {
      private FileInputStream fin;

      public MyInputStream(File file) throws IOException {
        fin = new FileInputStream(file);
      }

      @Override
      public int read() throws IOException {
        return fin.read();
      }

      @Override
      public int read(byte[] b, int off, int len) throws IOException {
        return fin.read(b, off, len);
      }
    }

### Exceptions

This rule doesn’t raise an issue when the class is declared `abstract`.