본문 바로가기

Engineering/Java

Files.lines(path) 는 잘 알고 사용하자.

728x90

Files.lines(filePath).forEach(line -> ...) 이런 코드를 사용하는 프로그램이  참조하는 파일 항상 삭제가 안되는 버그가 발생했다.

        File symbolFile = new File("C:\\Users\\user\\readSymbol\\temp\\symbol.txt");
        Files.lines(symbolFile.toPath()).forEach(line -> {
            if (line.contains("GetBranchName")) {
                log.debug("GetBranchName:{}", line);
            }
        });

 

프로그램 종료 시점에 임시로 생성했던 temp 디렉토리를 지우는 로직이 있는데도, 항상 symbol.txt 파일이 남아 있었다.

이전 부터 사용하던 코드라 옛날부터 그랬을거 같은데, 담당자가 바뀐 상황이니 어쩔 수 없이 수정해야지...

 

문제가 되는 코드가 아무래도 (java.nio.file) Files.lines 인거 같아서 설명을 찾아보니 파일의 모든 라인을 읽어서 Stream 으로 바꾼다. stream 을 종료할때 파일이 close 된다라고 되어 있다.

 

try with resource 문을 적용해서 stream 자원을 처리되도록 해야 한다. 

try (Stream<String> lines = Files.lines(symbolFile.toPath())) {
    lines.forEach(line -> {
        if (line.contains("GetBranchName")) {
            log.debug("GetBranchName:{}", line);
        }
    });
}

 

인터넷에 있는 코드 대충 보고 가져와서 작성하지 말자!!!