Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 InputStream transferTo() 메서드란? 스트림 간 데이터 복사를 간편하게

Java 9에서는 InputStream 클래스에 transferTo() 메서드가 새롭게 추가되었습니다. 이 메서드는 입력 스트림에서 출력 스트림으로 데이터를 복사하는 작업을 손쉽게 처리할 수 있도록 도와줍니다. 즉, 입력 스트림에서 모든 바이트를 읽어 들인 순서 그대로 출력 스트림에 기록하는 기능을 수행합니다.

Java 9 이전에는 스트림 간 데이터를 복사하려면 바이트 배열이나 버퍼를 직접 생성하고 반복문을 통해 읽고 쓰는 코드를 개발자가 일일이 작성해야 했습니다. 하지만 transferTo() 메서드의 등장으로 이러한 번거로운 과정이 단 한 줄의 호출로 대체되었으며, 내부적으로 버퍼를 활용해 효율적으로 동작하기 때문에 성능 면에서도 유리합니다.

메서드 시그니처

public long transferTo(OutputStream out) throws IOException

반환값은 실제로 전송(복사)된 바이트 수를 나타내며, 입출력 중 오류가 발생하면 IOException이 발생할 수 있습니다.

사용 예제

import java.util.Arrays;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class TransferToMethodTest {
    public void testTransferTo() throws IOException {
        byte[] inBytes = "tutorialspoint".getBytes();
        ByteArrayInputStream bis = new ByteArrayInputStream(inBytes);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            bis.transferTo(bos);
            byte[] outBytes = bos.toByteArray();
            System.out.println(Arrays.equals(inBytes, outBytes));
        } finally {
            try {
                bis.close();
            } catch(IOException e) {
                e.printStackTrace();
            }
            try {
                bos.close();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String args[]) throws Exception {
        TransferToMethodTest test = new TransferToMethodTest();
        test.testTransferTo();
    }
}

위 예제에서는 문자열 "tutorialspoint"를 바이트 배열로 변환한 뒤 ByteArrayInputStream에 담고, transferTo() 메서드를 사용하여 ByteArrayOutputStream으로 그대로 복사합니다. 마지막으로 Arrays.equals() 메서드를 통해 입력 데이터와 출력 데이터가 동일한지 검증합니다.

실행 결과

true

입력 바이트 배열과 출력 바이트 배열이 완전히 일치하므로 true가 출력됩니다.

transferTo() 메서드의 주요 장점

  • 코드 간결화: 반복문과 버퍼 관리 코드 없이 한 줄로 스트림 복사가 가능합니다.
  • 성능 향상: 내부적으로 버퍼를 사용하여 효율적인 데이터 전송을 수행합니다.
  • 가독성 향상: 의도가 명확하게 드러나므로 유지보수가 쉬워집니다.
  • 다양한 활용: 파일 복사, 네트워크 데이터 전송 등 InputStream과 OutputStream을 다루는 거의 모든 상황에서 활용할 수 있습니다.

참고로 파일 복사와 같은 경우에는 try-with-resources 문법을 함께 사용하면 스트림을 자동으로 닫아주기 때문에 더욱 안전하고 깔끔한 코드를 작성할 수 있습니다.