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 : 파일의 모든 속성 복사(권한, 읽기 전용)
		// 자원 반납
	}

}


+ Recent posts