기존 java.io API와 다른 새로운 입출력 API
네트워크 지원 강화된 NIO.2 API 추가
⭐️ 입력 스트림과 출력 스트림으로 구분되어 별도 생성
Ex) 하나의 파일에서 데이터를 읽고 저장하는 작업을 모두 해야한다면 FileInputStream과 FileOutputStream을 별도로 생성해야 함
넌버퍼(non-buffer)
IO에서는 1바이트씩 읽고 출력 <- 느림, 속도를 위해 보조 스트림인BufferedInputStream, BufferedOutputStream를 사용해 버퍼를 이용하기도 함. 스트림으로부터 입력된 전체 ⭐️ 데이터를 별도로 저장해야 저장 후 입력 데이터의 위치 이동해가면서 자유롭게 이용 가능
블로킹(blocking)
⭐️ 양방향으로 입출력이 가능하므로 하나만 생성
Ex) 하나의 파일에서 데이터를 읽고 저장하는 작업을 모두 해야 한다면 FileChannel 하나만 생성하면 됨
버퍼(buffer)
기본적으로 버퍼 사용해 입출력 <- 성능 좋음, 읽은 데이터를 무조건 버퍼(buffer: 메모리 저장소)에 저장 ⭐️ 데이터를 별도의 공간에 저장할 필요없이 버퍼 내에서 데이터 위치 이동해 가면 필요한 부분만 읽고 쓸 수 있음
블로킹,넌블로킹
NIO블로킹은 스레드를 interrupt함으로써 뺘져나올 수 있음
NIO는 넌블로킹 지원 : 입출력 작업 시 스레드가 블로킹되지 않음
준비 완료된 채널을 선택할 수 있음
IO : 파일의 속성 정보를 읽기 위해 File 클래스 제공
NIO : 다양한 파일의 속성정보를 제공해주는 클래스와 인터페이스를 java.nio.file, java.nio.file.attribute 패키지에서 제공
Path path = Paths.get(String first, String...moare)
//Path의 구현 객체를 얻기 위해서는 java.nio.file.Paths클래스의 정적 메소드인 get()메소드를 호출함
Path path = Paths.get(URI uri);
get() 메소드의 매개값
절대경로 지정
Path path = Paths.get("C:/Temp/dir/file.txt");
//index 0 / 1 / 2
Path path = Paths.get("C:/Temp/dir", "file.txt");
Path path = Paths.get("C:", "Temp", "dir","file.txt");
상대경로 지정 (현재 위치가 "C:/Temp"일 경우) 지정
Path path = Paths.get("dir/file.txt");
Path path = Paths.get("./dir/file.txt");
Path path = Paths.get("../dir2/file.txt");
.은 나 자신 , ..은 부모
java.nio.file.Path 인터페이스 메소드
java.nio.file.FileStystem 인터페이스 사용
FileSystem fileSystem = FileSystems.getDefault();
//FileSystem의 구현 객체를 얻기 위해서는 java.nio.file.FileSystems클래스의 정적 메소드인 getDefualt()메로드를 호출함
java.nio.file.FileStystem 인터페이스 메소드
java.nio.file.FileStore 드라이버를 나타내는 클래스, 제공 메소드
java.nio.file.Files 클래스의 제공 메소드
파일 속성 읽기 및 파일, 디렉터리 생성/삭제
파일 변경 통지 메커니즘
디렉터리 내부에서 파일 생성,삭제,수정 등의 내용 변화를 감시하는데 사용됨
Ex) 에디터에서 파일을 편집하고 있을 때,에디터 바깥에서 파일 내용을 수정하게 되면 파일 내용이 변경 됐으니 파일을 다시 불러올 것인지 묻는 대화상지를 띄우는 것