관리 메뉴

피터의 개발이야기

[Java 8] Stream은 사용 후 반드시 close 해야합니까? 본문

Programming/JAVA

[Java 8] Stream은 사용 후 반드시 close 해야합니까?

기록하는 백앤드개발자 2023. 2. 8. 19:00
반응형

 

소스가 IO 채널인 Files.lines(Path, Charset) Stream만 닫아야 합니다.

 

스트림에는 BaseStream.close() 메서드가 있고 AutoCloseable을 구현하지만 거의 모든 스트림 인스턴스는 실제로 사용 후 닫을 필요가 없습니다. 일반적으로 소스가 IO 채널인 Stream(ex: Files.lines(Path, Charset)에서 반환된 스트림)만 닫아야 합니다. 대부분의 스트림은 특별한 리소스 관리가 필요하지 않은  Collections, Arrays, generating functions에 의해 지원됩니다. 스트림을 닫아야 하는 경우 try-with-resources 문에서 리소스로 선언할 수 있습니다. 

 

 public static void main(String[] args) {

    Stream<String> stream = Stream.of("A", "B", "C");

    List<String> filter = stream.filter(x -> !x.equalsIgnoreCase("B"))
        .collect(Collectors.toList());

    // no need close the stream.
    //stream.close();

    System.out.println(filter); // [A, C]

}

일반적 스트림의 경우 스트림 인스턴스를 사용 후 닫을 필요가 없습니다.

 

 

    @Test
    public void fileWriteTest(){
   		 String path = "c:\\projects\\app.log";

		// auto close
        try (Stream<String> lines = Files.lines(Paths.get(path))) {

            String content = lines.collect(Collectors.joining(System.lineSeparator()));
            
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

소스가 IO 채널인 스트림의 경우 try-with-resources을 사용하여 닫습니다. Java7 이전에, try-catch-finally 구문에서 자원을 해제하였습니다.Java8에서는 AutoCloseable인테페이스로 구현된 자원은 자동으로 close됩니다. close가 작동하는 원리를 파악하기 위해 AutoCloseable을 구현하는 클래스 만들기어 테스트를 진행해 보았다. 그 방법은 이곳에 정리하였습니다.

 

 

ㅁ 함께 보면 좋은 사이트

 

[JAVA] 자바 파일 입출력, 커스컴 AutoCloseable

서론 데이터 백업 작업 시에 파일을 읽고 쓰는 로직이 필요하여 정리를 하였습니다. 자바8 이후 자원의 생성과 해제가 자동입니다. Java - Try-with-resources로 자원 쉽게 해제 Java7 이전에, try-catch-final

peterica.tistory.com

 

Stream (Java Platform SE 8 )

A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using Stream and IntStream: int sum = widgets.stream() .filter(w -> w.getColor() == RED) .mapToInt(w -> w.getWeight())

docs.oracle.com

 

반응형
Comments