"오, 리시! 안녕!"

"안녕, 아미고! 생활은 어때?"

"훌륭합니다. Bilaabo가 File에 대한 여러 가지 흥미로운 점과 작업 방법을 알려주었습니다."

"공교롭게도 이 주제에 대해 추가할 것이 있는 것 같습니다."

"정말요? 그럼 저는 귀를 기울이겠습니다."

"좋아요. 들어보세요. Java는 끊임없이 진화하고 있습니다. 개발자는 다양한 작업을 보다 효율적으로 수행할 수 있는 새로운 방법을 끊임없이 찾고 있습니다. Java 7에서는 File 클래스에 대한 대안을 추가했습니다."

파일, 경로 - 1

"대안?"

"네. 그들은 File 클래스를 기본으로 삼고, 몇 가지 새로운 것을 추가하고, 메서드의 이름을 바꾼 다음 두 개로 분할했습니다. 이제 두 개의 새 클래스가 있습니다: PathFilesPath 는 실제로 File의 새로운 아날로그입니다. 클래스이고 File 은 유틸리티 클래스(Arrays 및 Collections 클래스와 유사)입니다. File 클래스의 모든 정적 메서드는 거기에 있습니다. 이렇게 하는 것이 OOP 측면에서 '더 정확'합니다."

"음, OOP의 관점에서라면 알겠습니다. 그래서 무엇이 바뀌었습니까?"

"첫째, 그들은 String  및 File 객체를 반환하는 메서드를 재현하지 않기로 결정했습니다  . Path  클래스에서 모든 메서드는 Path 를 반환합니다 .

"두 번째로 많은 정적 유틸리티 메서드를 Files 클래스로 옮겼습니다."

"셋째, 상대 경로로 작업하는 것이 더 편리해졌습니다."

"방법 목록은 다음과 같습니다."

Path 클래스의 메서드 설명
boolean isAbsolute() 경로가 절대 경로이면 true를 반환합니다.
Path getRoot() 현재 경로의 루트, 즉 최상위 디렉터리를 반환합니다.
Path getFileName() 현재 경로에서 파일 이름을 반환합니다.
Path getParent() 현재 경로에서 디렉토리를 반환합니다.
boolean startsWith(Path other) 현재 경로가 전달된 경로로 시작하는지 확인합니다.
boolean endsWith(Path other) 현재 경로가 전달된 경로로 끝나는지 확인합니다.
Path normalize() 현재 경로를 정규화합니다. 예를 들어 «c:/dir/dir2/../a.txt»를 «c:/dir/a.txt»로 변환합니다.
Path relativize(Path other) 두 경로의 상대 경로, 즉 «경로 간의 차이»를 계산합니다.
Path resolve(String other) 현재 경로와 상대 경로를 사용하여 절대 경로를 확인합니다.
URI toUri() 현재 경로/파일인 경우 URI를 반환합니다.
Path toAbsolutePath() 상대 경로인 경우 경로를 절대 경로로 변환합니다.
File toFile() 현재 Path 객체에 해당하는 File 객체를 반환합니다.

"그리고 현재 경로는-그게 뭐죠?"

"이는 메서드가 호출되는 Path 개체의 생성자에 전달된 경로입니다."

"좋아요. 그럼 Files 클래스에는 어떤 메서드가 있나요?"

"서둘러 어딘가로 가고 싶습니까? 지금 바로 말씀드리겠습니다. 가장 중요한 방법은 다음과 같습니다."

파일 클래스의 메서드 설명
Path createFile(…) 디스크에 파일을 생성합니다.
Path createDirectory(…) 디렉토리를 생성합니다.
Path createDirectories(…) 디렉토리와 모든 하위 디렉토리를 생성합니다.
Path createTempFile(…) 임시 파일을 생성합니다.
Path createTempDirectory(…) 임시 디렉토리를 생성합니다.
void delete(Path path) 파일을 삭제합니다.
Path copy(Path source, Path target,…) 파일을 복사합니다.
Path move(Path source, Path target,…) 파일을 이동합니다.
boolean isSameFile(Path, Path) 두 파일을 비교합니다.
boolean isDirectory(Path) 경로가 디렉토리입니까?
boolean isRegularFile(Path) 경로가 파일입니까?
long size(Path) 파일 크기를 반환합니다.
boolean exists(Path) 이름이 같은 개체가 존재합니까?
boolean notExists(Path) 같은 이름의 개체가 존재하지 않습니까?
long copy(InputStream, OutputStream) InputStream에서 OutputStream으로 바이트를 복사합니다.
long copy(Path, OutputStream) Path에서 OutputStream으로 모든 바이트를 복사합니다.
long copy(InputStream, Path) InputStream에서 Path로 모든 바이트를 복사합니다.
byte[] read(InputStream, int initialSize) InputStream에서 바이트 배열을 읽습니다.
byte[] readAllBytes(Path path) InputStream에서 모든 바이트를 읽습니다.
List<String> readAllLines(Path path,..) 텍스트 파일을 읽고 문자열 목록을 반환합니다.
Path write(Path path, byte[] bytes,…) 파일에 바이트 배열을 씁니다.

"흥미롭다! 멋진 기능이 너무 많고 모두 같은 위치에 있다."

"글쎄요. 인터넷에서 파일을 다운로드한 다음 누군가에게 보내고 싶다고 가정해 보겠습니다. 이렇게 하려면 디스크에 임시 파일을 만들고 읽은 데이터를 저장하는 것이 매우 편리합니다."

"인터넷에서 파일을 다운로드하는 것이 어렵습니까?"

"매우 간단합니다. 다음 예를 보십시오."

암호
URL url = new URL("https://www.google.com.ua/images/srpr/logo11w.png");
InputStream inputStream = url.openStream();

Path tempFile = Files.createTempFile("temp-",".tmp");
Files.copy(inputStream, tempFile);

"그리고 그게 다야?"

"네, 무엇을 기대하셨습니까? 4줄 밖에 없습니다."

" 1행.  이미지 파일의 URL이 전달되는 URL 객체를 생성합니다.

" 2행.  파일을 읽기 위한 스트림(InputStream)이 url 객체에 열립니다.

" 3행.  이 createTempFile방법은 임시 파일을 만드는 데 사용됩니다.

" 4행.  Files.copy 메서드는 에서  inputStream 로 데이터를 복사합니다 tempFile. 그게 다입니다."

"영리한!"

"좋습니다. 마음에 드셨다니 기쁩니다. 나머지 방법은 스스로 알아낼 수 있을 것 같습니다. 그리고 디에고에게 몇 가지 작업을 맡기도록 하겠습니다."

"그런데, 여기 이 자료에 대한 좋은 링크가 있습니다."