java.io.OutputStream
나 java.io.FilterOutputStream
을 직접 서브 클래스로 만드려 할 때, 요구하는 스펙은 write()
만 재정의하면 됩니다.
하지만 실제로는 write(byte[],int,int)
메소드도 구현할 필요가 있습니다.
왜냐면 Stream
의 특성상 바이트를 하나하나 읽는 경우보다 여러 write(byte[],int,int)
을 이용하여 여러 바이트를 동시에 쓰는 경우가 많기 때문입니다.
write()
으로 하나하나 쓰게 되면 굉장히 비효율적이고 오버헤드가 많이 발생할겁니다.
따라서 서브 클래스에서 write(byte[],int,int)
에 효율적인 구현을 만들어 두는 것이 좋습니다.
이 규칙은 java.io.OutputStream
나 java.io.FilterOutputStream
의 서브 클래스를 만들려고 하지만 write(byte[,int,int)
를 재정의하지 않은 경우 경고 신호를 보냅니다.
규칙을 어긴 코드
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 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();
}
}
예외
이 규칙은 클래스가 abstract
로 되어있는 경우에는 동작하지 않습니다.
If you like SONARKUBE, don’t forget to give me a star.