chapter 1. Path 클래스 사용하기
java.nio.file.Path
Path 클래스 두 가지 용도
- 문법적인 용도로 파일시스템에 접근하지 않고 경로를 조작하는 작업에 주로 사용 (메모리상의 논리적인 조작)
- 경로를 참조하는 파일에 대한 작업
파일시스템 - 하드 드라이브 같은 일정한 형태의 미디어에 파일을 저장하고 구조적으로 관리하며, 같은 방법으로 파일을 쉽게 가져올 수 있게 만든 것
java.nio.file.FileSystems 을 사용하여 접근할 수 있다.
중요 메소드
- getDefault() : JVM에 기본 FileSystem(운영체제의 기본 파일시스템)을 반환하는 static 메소드
- getFileSystem(URI uri) : 인자의 URI 스키마와 일치하는 파일시스템 제공자(provider) 목록에서 파일시스템을 반환하는 static 메소드. 메모리 , 네트워크 , 가상 파일시스템에서 가져 올 수 있다.
FileSystems.getDefault().getPath(""); 의 단축 표기 법은 Paths.get(""); 이다.
Path.normalize(); --> 중복되는 부분을 정리한다.
URI 파일 예 : file:///rafaelnadal/tournaments/2009/BNP.txt
1.2 경로 정의 하기
- 절대 경로 정의 : Paths.get(“절대경로”);
- 상대 경로 정의 : Paths.get(“상대경로");
- 작업 폴더에서 상태 경로 정의 :
- 단축을 이용한 경로 정의 : . , .. 사용가능 , normalize() 중복 부분 제거
- URI에서 경로 정의 하기 : URI.create()이용하여
1.3 경로에 관한 정보 가져오기
- getFileName() : 경로가 가리키는 파일/디렉토리를 반환함.
- getRoot() : 경로에서 루트를 가져옵니다.(만약 경로에 root가 없다면 null)
- getParent() : 현재 경로의 부모를 가져옵니다.
- getNameCount() : 경로에 있는 요소 개수를 가져 온다.
- getName(int index) : 각 요소의 이름 가져오기
- subpath(start,end) : 상대경로를 추출할 수 있다. 시작 인텍스와 끝 인덱스를 주면 해당 범위 요소를 반환함.
주요 메소드들
1.4 Path의 변환 관련 메소드
- toString() : 문자열 변환
- toUri() : URI로 변환
- toAbsolutePath() : 절대 경로 변환
- toRealPath() : 실제 경로 변환 (아래 추가 설명)
- toFile() : 파일 객체로 변환
- FileInstance.toPath() : 파일 객체를 Path 객체로 변환
실제 경로를 반환하는 메소드
- toRealPath(Options..); 설명
실재 파일(existing file)의 실제 경로(real path)를 반환 한다. 여기서 실재 파일이라는 의미는 파일이 진짜로 있어야 한다는 뜻이다. 하지만 toAbsolutePath() 메소드를 사용할 때는 실재 파일일 필요가 없다. 심볼 링크를 지원하는 파일시스템에서는 toRealPath() 메소드에 어떤 인자를 전달하지 않는다면 경로에 있는 모든 심볼 링크를 실제 경로로 풀이한다. 변환과정에서 심볼링크를 제외하고 싶다면 메서드에 LinkOption.NOFOLLOW_LINKs enum 상수를 전달해야 한다. 또한 상대 경로를 전달하면 절대 경로를 반환하며, 경로에 중복 요소가 있다면 이를 제거한 경로 반환한다.
만약 toRealPath() 메소드는 파일이 없거나 파일에 접근할 수 없다면 IOException 예외를 던진다.
만약 toRealPath() 메소드는 파일이 없거나 파일에 접근할 수 없다면 IOException 예외를 던진다.
1.5 두 경로를 조합하기
- resolve() : 고정 경로에 부분경로 추가
- resolveSibling() : 형제 경로에서 부분경로 추가
1.6 두 위치 사이의 경로 생성하기
- relativize() : 한쪽 위치에서 다른 위치까지의 경로를 만들기
** 주의사항 : 만약 루트 패스가 한쪽에 있는 경우에는 정상적으로 패스를 만들지 못한다. (모두 있어야 한다.)
1.7 두 경로 비교하기
- equals() : 두 경로의 동등성은 비교 한다.
- 파일 시스템에 접근하지 않는다.
- 비교하는 경로로 실재 하지 않아도 된다.
- 경로가 파일인지 검사하지 않는다.
- OS에 따라 대소문자를 비교를 여부를 따진다.
- 상대경로와 절대경로는 같은 패스를 가르쳐도 동등하지 않는다.
- java.nio.file.Files.isSameFile() : 두개의 경로가 같은 파일/폴더인지만 검사한다. 내부에서 Path.equals를 사용하고 만약 false인 경우 이중 체크 작업 즉 파일시스템에 실재해야 한다. 만약 그렇지 않으면 IOException 예외를 던진다.
- Path는 Comparable 인터페이스 구현 하였음. 정렬은 사전편찬식 작은은 0 보다 작은값 크면 0 보다 큰값
- 부분비교 : startsWith() ,endsWith()
1.8 경로의 이름 요소 반복하기
Path는 Iterable 인터페이스 구현하고 있음. 명시적인 이터레이터를 사용하거나 foreach 루프를 사용할 수 있다.- 참고 문헌 : 한빛미디어 , 자바7 NIO.2 파일&네트워크 프로그램밍