Java NIO는 New Input Output의 줄임말로 기능 중 간단한 파일 제어만 설명
Java IO와는 다르게 Stream이 아니고 Channel 방식을 사용
1. Files, 파일 다루기
Files의 다양한 메소드들은 다음 예제를 통해 확인하자.
package chap11.exam13.files;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FilesExam {
// 파일의 속성을 알아 볼 수 있다.
public static void main(String[] args) throws Exception {
Path path = Paths.get("C:/img/asd.txt");
System.out.println("디렉토리 여부 : " + Files.isDirectory(path));
System.out.println("파일 여부 : " + Files.isRegularFile(path));
System.out.println("마지막 수정 시간 : " + Files.getLastModifiedTime(path));
System.out.println("파일 크기 : " + Files.size(path));
System.out.println("소유자 : " + Files.getOwner(path));
System.out.println("숨김 파일 여부 : " + Files.isHidden(path));
System.out.println("읽기 가능 여부 : " + Files.isReadable(path));
System.out.println("쓰기 가능 여부 : " + Files.isWritable(path));
System.out.println("실행 여부 : " + Files.isExecutable(path));
}
}
2. FileSystem, 파일 정보
FileSystem은 현재 시스템의 다양한 정보를 불러올 수 있다.
Iterable에 FileStroe을 붙여서 사용
package chap11.exam13.files;
import java.io.IOException;
import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
public class FileSystemExam {
// 파일 시스템(파일/폴더/저장공간) 정보
public static void main(String[] args) throws IOException {
// 기본 파일 시스템 정보 추출하는 객체
FileSystem fs = FileSystems.getDefault();
Iterable<FileStore> infolist = fs.getFileStores();
for(FileStore info : infolist) {
System.out.println("드라이브 이름 : " + info.name());
System.out.println("저장 타입 : " + info.type());
System.out.println("용량 : " + info.getTotalSpace()/(1024*1024*1024) + "GB");
System.out.println("사용 가능한 용량 : " + info.getUsableSpace()/(1024*1024*1024) + "GB");
}
System.out.println("====현재 사용중인 드라이버 루트 ====");
for(Path path : fs.getRootDirectories()) {
System.out.println(path.toString());
}
}
}
3. Path, 경로
Path는 경로에 관련된 다양한 메소드들이 있다.
폴더 생성 또는 파일 이름만 뽑는다던가 상위 폴더를 알아 낸다던가 등 여러가지 있다.
package chap11.exam13.files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathExam {
// 1. 파일 경로 확인 전문화
public static void main(String[] args) {
// 특정 경로의 파일 정보를 가져옴(Uri | String)
Path path = Paths.get("C:/img/temp/10multi_copy");
// 파일명
System.out.println(path.getFileName());
// 부모 확인
System.out.println(path.getParent().getFileName());
// 루트 확인
System.out.println(path.getRoot());
// 위에 쓴 경로들의 단계 수
System.out.println(path.getNameCount());
// 개별 단계 확인
for(int i = 0; i < path.getNameCount(); i++) {
System.out.println(i + " 단계 : " + path.getName(i));
}
}
}
package chap11.exam13.files;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class MKdirExam {
// 디렉토리 및 파일 생성
public static void main(String[] args) throws Exception {
Path path = Paths.get("c:/img/test");
// !File.exists()
if(Files.notExists(path)) {
System.out.println("폴더 생성");
Files.createDirectories(path);
}
path = Paths.get("c:/img/test/textFile.txt");
if(Files.notExists(path)) {
System.out.println("파일 생성");
Files.createFile(path);
}
}
}
4. WatchService, 파일 감시
WatchService는 지정한 폴더 내부의 파일이 생성되거나 수정되거나 삭제되는 경우를 감지하는 기능을 가지고 있다.
생성 시 감시할 이벤트들을 설정하고 사용한다.
package chap11.exam13.files;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
public class WatchServiceExam {
// 특정 경로의 파일 변경을 감시
public static void main(String[] args) throws Exception {
// 기본 영역 지정
WatchService watch = FileSystems.getDefault().newWatchService();
// 감시 할 상세 주소 지정
Path path = Paths.get("c:/img");
// 어떤 와치 서비스가 어떤것을 감시하나?
path.register(watch, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
// 감시 실행
while(true) {
// 등록한 이벤트 발생 시 WatchKey로 반환
WatchKey key = watch.take();
// 이벤트 추출, ?는 와일드 카드 타입
List<WatchEvent<?>> list = key.pollEvents();
// 상세 내용을 추출
for(WatchEvent e: list) {
// 이벤트 상세 내용
Kind evtKind = e.kind();
Path evtPath = (Path) e.context();
System.out.println(evtKind);
System.out.println(evtPath);
}
// 다 쓰고난 이벤트 키는 리셋 해 주어야 한다.
// reset을 하지 않으면 감시가 일회성으로 끝난다.
// false : 초기화 실패, 해당 디렉토리가 사라진 경우
boolean success = key.reset();
System.out.println(success);
}
}
}
5. Path를 이용한 Write Read Copy
위에 사용한 Path를 이용하여 파일을 만들거나 읽거나 복사하는 기능
쓰기
package chap11.exam14.fileRW;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Scanner;
public class fileWriteEx {
public static void main(String[] args) throws Exception{
// 파일 위치 지정
Path path = Paths.get("c:/img/write.txt");
// 쓰기 할 값 입력 받기
Scanner scan = new Scanner(System.in);
System.out.println("아무거나 입력하세요!");
String txt = scan.nextLine() + "\r\n";
// 스트림 준비 + 쓰기
Files.write(path, txt.getBytes(), StandardOpenOption.APPEND);
System.out.println("저장 되었습니다.");
// 자원반납(flush, close) - 생략
}
}
읽기
package chap11.exam14.fileRW;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class FileReadEx {
public static void main(String[] args) throws Exception {
// 1. 경로
Path path = Paths.get("C:/img/asd.txt");
// 2. 스트림 생성 // 3. 읽기
List<String> contents = Files.readAllLines(path, Charset.forName("UTF-8"));
// 4. 출력
for(String line : contents) {
System.out.println(line);
}
}
}
복사
package chap11.exam14.fileRW;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
public class FileCopyEx {
// 파일 복사
public static void main(String[] args) throws Exception {
// 읽어와서 -> 쓰기
// 파일 지정
Path from = Paths.get("c:/img/10multi.pdf");
Path to = Paths.get("c:/img/temp/10multicopyFile");
// 스트림 + 읽기 + 읽어온 값 쓰기
Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING);
System.out.println("파일 복사 완료");
// REPLACE_EXISTING : 기존 파일이 있으면 덮어쓰기
// COPY_ATTRIBUTES : 파일의 모든 속성 복사(권한, 읽기 전용)
// 자원 반납
}
}