When directly subclassing java.io.OutputStream
or java.io.FilterOutputStream
, the only requirement is that you implement
the method write(int)
. However most uses for such streams don’t write a single byte at a time and the default implementation for
write(byte[],int,int)
will call write(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
write(byte[],int,int)
.
This rule raises an issue when a direct subclass of java.io.OutputStream
or java.io.FilterOutputStream
doesn’t provide an
override of write(byte[],int,int)
.
public class MyStream extends OutputStream { // Noncompliant private FileOutputStream fout; public MyStream(File file) throws IOException { fout = new FileOutputStream(file); } @Override public void write(int b) throws IOException { fout.write(b); } @Override public void close() throws IOException { fout.write("\n\n".getBytes()); fout.close(); super.close(); } }
public class MyStream extends OutputStream { private FileOutputStream fout; public MyStream(File file) throws IOException { fout = new FileOutputStream(file); } @Override public void write(int b) throws IOException { fout.write(b); } @Override public void write(byte[] b, int off, int len) throws IOException { fout.write(b, off, len); } @Override public void close() throws IOException { fout.write("\n\n".getBytes()); fout.close(); super.close(); } }
This rule doesn’t raise an issue when the class is declared abstract
.