Paths는 path를 생성하는 공장이다.
경로 문자열을 넣으면 Path 객체로 변환해 준다.
Path path = Paths.get("C:/temp/myfile.txt");
//내부적으로 OS에 맞는 경로 구분자로 자동 처리
Path path = Paths.get("C:", "temp", "myfile.txt");
Paths는 경로를 객체로 다루게 해준다.
| 기능 | 메서드 | 예시 |
|---|---|---|
| 파일명/확장자 가져오기 | getFileName() | "myfile.txt" |
| 특정 경로의 부모 디렉토리 가져오기 | getParent() | "C:/temp" |
| 경로의 특정 요소 가져오기 | getName(int index) | "temp" |
| 경로 결합(확장) | resolve() | "C:/temp/new" |
| 상위 경로로 이동 | normalize() | "../" 처리 |
Paths가 있기 전, File 클래스에는 Path같은 개념이 없고 파일 경로는 String으로 표현했다.
기존 File 클래스(java.io.File)가 가진 문제는 다음과 같다.
파일과 디렉토리를 실제로 조작하는 기능을 제공하는 클래스,
Files는 모든 메서드가 static인 유틸리티 클래스이다.
File은 다음과 같은 문제가 있었다.
이 문제를 해결하기 위해 NIO.2 (New IO)가 도입되었고 위에서 설명한 Paths, Path + Files 조합으로 파일 처리 방식이 만들어졌다.
| 요소 | 역할 |
|---|---|
Path | "주소(경로) 자체"를 표현하는 객체 |
Paths | 주소(Path)를 생성하는 공장 |
Files | 그 주소(Path)에 있는 파일을 읽고/쓰기/삭제하는 작업자 |
| 기능 | 설명 |
|---|---|
| 파일 생성 | Files.createFile() |
| 디렉토리 생성 | Files.createDirectory() |
| 파일이 존재하는지 확인 | Files.exists() |
| 파일 삭제 | Files.delete() |
| 파일 복사 / 이동 | Files.copy() / Files.move() |
| 파일 읽기 / 쓰기 | Files.readString() / Files.writeString() |
| 파일 속성 조회 | Files.size(), Files.getLastModifiedTime() |
| 스트림 기반 I/O 지원 | Files.newInputStream() / Files.newOutputStream() |
| 디렉토리 목록 순회 | Files.walk() |
File 클래스의 대부분 메서드는 예외를 던지지 않고 boolean을 반환한다.
| 메서드 | 던지는 예외 |
|---|---|
createNewFile() | IOException |
mkdirs() | 예외 없음 (boolean 반환) |
delete() | 예외 없음 (boolean 반환) |
renameTo() | 예외 없음 (boolean 반환) |
listFiles() | 파일 시스템 문제 시 SecurityException |
File file = new File("/system/protected.txt");
if (!file.delete()) {
System.out.println("삭제 실패, 이유는 알 수 없음");
}
| 예외 타입 | 의미 |
|---|---|
NoSuchFileException | 파일이 존재하지 않음 |
FileAlreadyExistsException | 생성하려는데 파일이 이미 있음 |
DirectoryNotEmptyException | 디렉토리가 비어 있지 않아 삭제 불가 |
AccessDeniedException | 권한 없음 |
IOException | 입출력 문제의 최상위 예외 |
Path path = Paths.get("/system/protected.txt");
Files.delete(path);
//실패했을 경우 예외로 알려줌
Exception in thread "main" java.nio.file.AccessDeniedException: /system/protected.txt