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
.