Files, Path
NIO (NonBloking Input-Output)
입출력 모듈 중에 프로그램 입출력(In/Out)부터 제어권을 CPU 가 가져와서 작업을 진행하는 것으로 CPU 는 명령어의 수행을 완료할 때까지 기다린다. 따라서 이 기능은 처리 시간이 많이 소모한다.
그래서인지 IO 는 이런 문제점 때문에 파일 입출력이 느리다는 한계점에 부딫히고, 이런 문제점을 극복한Non-blocking IO(nio, New IO) API를 제공해서 개선하였다.
결론은 Non-Blocking API 는 하나의 Thread 가 IO작업에 의존적이지 않기 때문에 하나의 쓰레드로 다수의 IO를 처리할 수도 있다.
그래서 이러한 NIO, IO패키지에 속한 Path, File에 대해서 알아볼려고 한다.
Path
Path 클래스는 IO 의 java.io.File클래스에 대응되는 자바 7에서 추가된 java.nio.file 패키지에 속한 인터페이스이며, 디렉토리의 경로를 표현하고 다룰 수 있는 방법을 제공한다.
Path를 통해, 파일, 디렉토리 옮기기, 복사, 삭제, 읽기, 쓰기 등의 작업을 수행할 수 있는데, 자주 쓰는 코드는 Path 구현 객체는 java.nio.file.Paths 클래스의 get() 정적 메소드를 호출하여 얻는다.
1
2
Path path = Paths.get(String first, String... more)
Path path = Paths.get(URI uri);
Paths 클래스는 Path를 다룰 수 있는 여러 메서드를 제공하며, Paths 또한 java.nio.file 패키지에 속해있다.
중요한 점은, Path는 단순히 경로정보를 캡슐화한 것이다. 파일의 존재 여부는 상관 없다.
- 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.nio.file.Path;
import java.nio.file.Paths;
Path path = Paths.get("c:\\ex\\Test.txt"); // 절대경로
path.getFileName(); // getFileName:파일네임 반환
path.getParent(); // getParent: 부모 주소 반환
path.getRoot(); // getRoot: 디렉토리 최상위 루트 반환 c:\
path.isAbsolute(); // isAbsolute: 절대경로인지를 판단
URI uri = path.toUri(); // toUri: 전체 경로 URI를 반환
Path path2 = path.toAbsolutePath(); // toAbsolutePath : 졀대경로를 반환
Path pathEx = Paths.get("c:\\ex\\abc\\dfg\\test.txt");
Path path3 = pathEx.subpath(0, 3);
// subpath: 몇번째 디렉토리부터 몇번째 디렉토리 값을 읽어올지 지정 가능
Path p1 = Paths.get("c:\\ex\\ex1");
Path p2 = Paths.get("test.txt");
Path p3 = p1.resolve(p2); // resolve: 경로 합치기
- 요약: Path는 디렉토리의 경로에 대한 유틸
File
File은 java.io에, Files는 java.nio에 속한 클래스이다.
Files은 파일 시스템을 통해, 파일을 다루는 여러 유틸리티 메서드를 제공하며, Files는 File과 달리, 주로 Path객체를 사용해 메서드를 사용한다.
즉 파일과 디렉토리 생성과 삭제, 이 속성들을 읽는 메소드를 제공한다.
- Files 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
// 파일 또는 디렉토리 존재 유무 확인
Path path = Paths.get("c:\\ex\\test");
Files.exists(path);
Files.isReadable(path); // 읽기 가능 여부 체크
Files.isWritable(path); // 쓰기 가능 여부 체크
Files.isExecutable(path); // 실행 가능 여부 체크
Path testPath = Paths.get("c:\\test\\ex");
try {
Path dir = Files.createDirectories(testPath); // 디렉토리 생성. 예외처리 필요
} catch (IOException e) {
e.printStackTrace();
}
Path pathFile = Paths.get("c:\\ex\\test.txt");
Path file = null;
try {
file = Files.createFile(pathFile); // 파일 생성.
} catch (IOException e) {e.printStackTrace();}
try {
Files.delete(pathFile); // 파일 삭제
} catch (IOException e) {e.printStackTrace();}
try {
Files.delete(pathFile); // 디렉토리 삭제
} catch (IOException e) {e.printStackTrace();}
- 요약: Files은 파일의 속성에 대한 유틸을 제공