"read(byte[],int,int)"은 오버라이딩 되어야 합니다

 

java.io.InputStreamjava.io.FilterInputStream을 직접 서브 클래스로 만드려 할 때, 요구하는 스펙은 read()만 재정의하면 됩니다. 하지만 실제로는 read(byte[],int,int) 메소드도 구현할 필요가 있습니다. 왜냐면 Stream의 특성상 바이트를 하나하나 읽는 경우보다 여러 read(byte[],int,int)을 이용하여 여러 바이트를 동시에 읽어오는 경우가 많기 때문입니다. read()으로 하나하나 읽어오게 되면 굉장히 비효율적이고 오버헤드가 많이 발생할겁니다. 따라서 서브 클래스에서 read(byte[],int,int)에 효율적인 구현을 만들어 두는 것이 좋습니다.

이 규칙은 java.io.InputStreamjava.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. :star2:

원문으로 바로가기

Star This Project