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