try-with-resource에 대한 입력 출력 흐름 자동 닫기

5240 단어 Java 기반
최근에 코드 심사를 할 때 심사 도구는 내가try-catch-finally를 교체할 것을 제시했고 회사의 관련 요구에 따라 이 제시의 등급은 아직 낮지 않고 수정하지 않으면 통과하지 못한다.코드부터 살펴보십시오.
FileReader fr = null;  
BufferedReader br = null;

try {
    fr = new FileReader(fileName);
    br = new BufferedReader(fr);
    return br.readLine();
} catch (Exception e) {
    log.error("error:{}", e);
} finally {
  if (br != null) {
    try {
      br.close();
    } catch(IOException e){
      log.error("error:{}", e);
    }
  }

  if (fr != null ) {
    try {
      br.close();
    } catch(IOException e){
      log.error("error:{}", e);
    }
  }
}

승인 도구는 다음과 같이 교체해야 합니다.
try (
    FileReader fr = new FileReader(fileName);
    BufferedReader br = new BufferedReader(fr)
  ) {
    return br.readLine();
}catch (Exception e) {
    log.error("error:{}", e);
}

또는
try (
    BufferedReader br = new BufferedReader(new FileReader(fileName))
  ) { 
    // no need to name intermediate resources if you don't want to
    return br.readLine();
}
catch (Exception e) { 
    log.error("error:{}", e);
}

코드를 비교해 보면 입력 출력 흐름의 닫기에 차이가 있음을 발견하기 어렵지 않다.설마 입력과 출력 흐름을 닫을 필요가 없단 말인가?이 문제를 가지고 원본 코드를 보니
public class FileInputStream extends InputStream{}

public abstract class InputStream implements Closeable {}


/**
 * A {@code Closeable} is a source or destination of data that can be closed.
 * The close method is invoked to release resources that the object is
 * holding (such as open files).
 *
 * @since 1.5
 */
public interface Closeable extends AutoCloseable {}


/**
 * An object that may hold resources (such as file or socket handles)
 * until it is closed. The {@link #close()} method of an {@code AutoCloseable}
 * object is called automatically when exiting a {@code
 * try}-with-resources block for which the object has been declared in
 * the resource specification header. This construction ensures prompt
 * release, avoiding resource exhaustion exceptions and errors that
 * may otherwise occur.
 *
 * @apiNote
 * 

It is possible, and in fact common, for a base class to * implement AutoCloseable even though not all of its subclasses or * instances will hold releasable resources. For code that must operate * in complete generality, or when it is known that the {@code AutoCloseable} * instance requires resource release, it is recommended to use {@code * try}-with-resources constructions. However, when using facilities such as * {@link java.util.stream.Stream} that support both I/O-based and * non-I/O-based forms, {@code try}-with-resources blocks are in * general unnecessary when using non-I/O-based forms. * * @author Josh Bloch * @since 1.7 */

public interface AutoCloseable {}

4AutoCloseable 말 그대로 자동으로 흐름을 닫는다.주석에서 알 수 있듯이 AutoCloseable이try()에서 설명한 대상은try-with-resource 코드 블록이 실행되었을 때close() 방법을 자동으로 호출합니다.주의:try-with-resources 문장은 일반적인try 문장처럼catch와finally 블록이 있을 수 있습니다.try-with-resources 문장에서 임의의catch나finally 블록은 성명된 자원이 닫힌 후에 실행됩니다.

좋은 웹페이지 즐겨찾기