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 : 파일의 모든 속성 복사(권한, 읽기 전용) // 자원 반납 } }
'개념 및 코딩 > 09.Java IO' 카테고리의 다른 글
[JAVA]09-04.보조 스트림 : DataStream, ObjectStream, PropReader Writer (0) | 2018.09.27 |
---|---|
[JAVA]09-03. 보조 스트림 : Buffer Stream (0) | 2018.09.27 |
[JAVA]09-02.File, File Reader, File Writer (0) | 2018.09.27 |
[JAVA]09-01.InputStream, OutputStream, Console, Scanner (0) | 2018.09.21 |
[JAVA]09-01.Stream (0) | 2018.09.11 |