ModuleReader — 모듈 내용에 대한 접근을 제공하는 리더
ModuleReader — 모듈 내용에 대한 접근을 제공하는 리더
ModuleReader는 모듈의 내용(content)에 접근할 수 있게 해 주는 인터페이스예요. Closeable을 확장하며, 모듈이 로드됐는지와 무관하게 모듈의 리소스에 접근해야 하는 경우를 위해 설계됐어요.
본문
예를 들어 파일 시스템의 패키징된 모듈 집합을 스캔하는 프레임워크는 모듈 리더를 사용해 각 모듈의 특정 리소스에 접근할 수 있어요. 모듈 리더는 모듈에서 클래스와 리소스를 로드하는 ClassLoader 구현에서도 사용하도록 의도됐어요.
모듈의 리소스는 /로 구분된 경로 문자열인 추상 이름(abstract name) 으로 식별돼요. 예를 들어 모듈 java.base는 리소스 "java/lang/Object.class"를 가질 수 있는데, 관례상 java.lang.Object의 클래스 파일이에요. 모듈 리더는 모듈 내용의 디렉터리를 리소스로 취급할 수 있어요(그 여부는 모듈 리더마다 다름). 모듈 내용의 디렉터리를 리소스로 찾을 수 있다면 그 이름은 슬래시('/')로 끝나요. 그 디렉터리는 끝 슬래시를 뺀 이름으로도 찾을 수 있어요.
ModuleReader는 생성 시 열리고, close 메서드를 호출해 닫혀요. 모듈 리더를 닫지 않으면 리소스 누출이 생길 수 있어요. try-with-resources 문이 모듈 리더가 닫히도록 보장하는 유용한 구조예요.
ModuleReader 구현은 모듈의 리소스에 접근하기 위해 권한이 필요할 수 있어요. 그래서 find, open, read, list 메서드는 보안 관리자가 접근을 거부하면 SecurityException을 던질 수 있어요.
구현 요구 사항: ModuleReader의 구현은 추상 리소스 이름을 패키징된 모듈이나 파일 시스템의 리소스 위치로 변환할 때 각별히 주의해야 해요.
주요 메서드
Optional<URI> find(String name)— 리소스의 URI를 찾아요 (없으면 빈 Optional).Optional<InputStream> open(String name)— 리소스를 위한 입력 스트림을 열어요.Optional<ByteBuffer> read(String name)— 리소스 내용을 읽어 버퍼로 반환해요.Stream<String> list()— 이 모듈의 모든 리소스 이름의 스트림을 반환해요.void close()— 모듈 리더를 닫아요.