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

 

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

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

원문으로 바로가기

Star This Project