Path

Programming/Java NIO 2015. 9. 15. 17:37

Java Path 인터페이스는 Java 6과 7에서 받은 Java NIO 2의 업데이트 일부이다. Java Path 인터페이스는 Java 7의 Java NIO에 추가되었다. Path 인터페이스는 java.nio.file 패키지에 위치하고 있으므로, Java Path 인터페이스의 완전한 이름은 java.nio.file.Path이다.


Java Path 객체는 파일 시스템의 경로를 대표한다. 경로는 파일이나 디렉토리를 가리킬 수 있다. 경로는 절대적이거나 상대적이 될 수 있다. 절대적 경로는 가리키는 파일이나 디렉토리 아래 까지 파일 시스템의 루트영역부터 전체 경로가 포함된다. 상대적 경로는 일부 다른 경로에 상대적 디렉토리나 파일 경로가 포함된다. 상대적 경로는 약간 혼란스럽게 들릴지도 모른다. 하지만 걱정하마라. 상대적 경로는 이번 Java NIO Path 튜토리얼의 후반부에서 더 상세한 설명을 할 것이다.


일부 운영체제에서 다양한 path 환경 변수와 파일 시스템 경로에 혼란스러워 하지 마라. java.nio.file.Path 인터페이스는 path 환경 변수와는 아무런 관련이 없다.


java.nio.file.Path 인터페이스는 여러가지 방면에서 java.io.File 클래스와 유사한 점이 있지만, 조금씩 다른 점들이 존재한다. 많은 경우에 Path 인터페이스를 File 클래스로 대신 사용할 수 있을지도 모른다.

Creating a Path Instance


java.nio.file.Path 객체를 사용하기 위해 Path 객체를 만들어야만 한다. Paths 클래스(java.nio.file.Paths)의 static 메소드인 Paths.get()를 사용하여 Path 객체를 만든다. 다음 Java의 Paths.get() 예제가 있다:

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathExample {

    public static void main(String[] args) {

        Path path = Paths.get("c:\\data\\myfile.txt");

    }
}

예제 상단에 두개의 import 선언문에 주목하기 바란다. Path 인터페이스와 Paths 클래스의 사용을 위해 저것들을 반드시 import 해야한다.


그 다음, Paths.get("c:\\data\\myfile.txt") 메소드를 호출하는 것에 주목하기 바란다. Path  객체를 만드는 Paths.get() 메소드를 호출하는 것이다. 바꿔 말하면, Paths.get() 메소드는 Path 객체들의 팩토리 메소드이다.

Creating an Absolute Path


절대적 파일을 매개변수로 갖는 Paths.get() 팩토리 메소드 호출에 의해 절대적 경로가 수행된다. 다음 절대적 경로를 대표하는 Path 객체의 생성 예제가 있다:

Path path = Paths.get("c:\\data\\myfile.txt");

절대적 경로는 c:\data\myfile.txt이다. 문자열에서 실제로 이 장소에 위치하고  있다는 의미인 \ 문자는 이스케이프 문자이기 때문에, Java 문자열에서 두개의 \ 문자를 사용할 필요가 있다.


위의 경로는 윈도우 파일 시스템 경로이다. Unix 시스템(Linux, MacOS, FressBSD 등)에서 위의 절대 경로는 아래와 같이 보일 수 있다:

Path path = Paths.get("/home/jakobjenkov/myfile.txt");

절대적 경로는 이제 /home/jakobjenkov/myfile.txt 이다. 


만약 윈도우 환경(경로는 / 로 시작함)에서 이와 같은 경로를 사용한다면, 경로는 현재 드라이브에 상대적으로  해석 될 것이다. 예를 들어, 경로가

/home/jakobjenkov/myfile.txt

은 C 드라이브에 위치 되어 있는 것으로 해석 될 수 있다. 그러면 경로는 다음 전체 경로로 부합될 것이다:

C:/home/jakobjenkov/myfile.txt

Creating a Relative Path


상대적 경로는 디렉토리나 파일에 하나의 경로(기본 경로)로부터 가리키는 경로이다. 상대적 경로의 전체 경로(절대적 경로)는 상대적 경로와 기본 경로의 결합으로 파생된다.


Java NIO Path 클래스는 절대적 경로들과 함께 사용되기도 한다. Paths.get(basePath, relativePath) 메소드를 사용하여 절대적 경로를 만든다. 다음 Java에서 두개의 절대적 경로 예제가 있다:

Path projects = Paths.get("d:\\data", "projects");

Path file     = Paths.get("d:\\data", "projects\\a-project\\myfile.txt");

첫번째 예제는 d:\data\projects의 경로(디렉토리)를 가리키는 Java Path 객체를 만든다. 두번째 예제는 d:\data\projects\a-project\myfile.txt 의 경로(파일)를 가리키는 Path 객체를 만든다.


상대적 경로들을 사용할 때 경로 문자열내에서 사용할 수 있는 특별한 코드가 두 개 있다. 다음 코드이다:

  • .
  • ..

. 코드는 "현재 디렉토리"를 의미한다. 예를 들어, 다음과 같이 절대적 경로를 만든다:

Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());

그러면 Java Path 객체의 절대적 경로는 위의 코드가 실행되는 애플리케이션의 디렉토리에 부합할 것이다.


만약 .이 경로 문자열 중간에 사용된다면, 경로가 가리키던 곳과 같은 디렉토리임을 의미한다. 다음 예제가 있다:

Path currentDir = Paths.get("d:\\data\\projects\.\a-project");

위 경로는 다음 경로와 부합된다:

d:\data\projects\a-project 

.. 코드는 "부모 디렉토리" 혹은 "한 단계 디렉토리 올라가기"를 의미한다. 다음 Java Path 예제가 있다:

Path parentDir = Paths.get("..");

위 예제에서 만들어진 Path 객체는 이 코드가 실행하는 애플리케이션 디렉토리의 부모 디렉토리에 부합할 것이다.


만약 .. 코드가 경로 문자열 중간에 사용된다면, 경로 문자열이 가리키는 곳에서 한 단계 위로 부합할 것이다. 예를 들어:

String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);

위 예제에서 만들어진 Java Path 객체는 다음 절대적 경로와 부합 될 것이다:

d:\data\projects\another-project 

a-project 디렉토리 뒤의 .. 코드는 위의 부모 디렉토리인 projects 디렉토리로 변경하고, 경로는 그곳으로부터 아래인 another-project 디렉토리를 참조한다.


.과 .. 코드는 Paths.get() 메소드의 두-문자열과 함께 결합하여 작동하기도 한다. 다음 두개의 Java Paths.get()의 예제를 보여준다:

Path path1 = Paths.get("d:\\data\\projects", ".\\a-project");

Path path2 = Paths.get("d:\\data\\projects\\a-project",
                       "..\\another-project");

상대적 경로들로 동작하기 위한 Java NIO Path 클래스의 다양한 사용 방법이 있다. 이 튜토리얼 후반부에서 그것들에 관해 더 배울 수 있을 것이다.

Path.normalize()


Path 인터페이스의 normalize()메소드는 경로를 표준화 할 수 있다. 표준화는 경로 문자열의 중간에 .과 ..을 모두 제거하고, 경로 문자열이 참조하는 경로를 풀어내는 것을 의미한다. 다음 Java Path.normalize() 예제가 있다:

String originalPath =
        "d:\\data\\projects\\a-project\\..\\another-project";

Path path1 = Paths.get(originalPath);
System.out.println("path1 = " + path1);

Path path2 = path1.normalize();
System.out.println("path2 = " + path2);

이 Path 예제는 처음에 경로 문자열에 .. 코드를 중간에 만든다. 그리고 예제는 이 경로 문자열로부터 Path 객체를 만들고, Path 객체를 출력(실제로는 Path.toString() 출력)한다.


그 다음, 반환하여 만들어진 새로운 Path 객체로 normalize()를 호출한다. 표준화된 Path 새로운 객체 또한 출력한다.


다음 위 예제로부터 출력 된 결과이다:

path1 = d:\data\projects\a-project\..\another-project
path2 = d:\data\projects\another-project

볼 수 있듯이, 표준화된 경로는 불피요한 부분인 a-project\.. 부분이 포함되지 않았다는 것을 볼 수 있다. 제거된 부분은 마지막 절대적 경로에 아무것도 추기하지 않는다.




'Programming > Java NIO' 카테고리의 다른 글

AsynchronousFileChannel  (0) 2015.09.15
Files  (0) 2015.09.15
vs. IO  (0) 2015.09.15
Pipe  (0) 2015.09.15
DatagramChannel  (0) 2015.09.11
Posted by 레미파
,