ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA NIO
    JAVA 2022. 10. 7. 10:27

     

    Java NIO

    Java IOAsyncronous(비동기)Channel이 추가된 개념이다.

    Java IO 에서는 File 객체를 통해 경로, 파일 정보, 파일 다루기를 했었는데 Java NIO에서는 각각에 특화된 클래스가 있다. (경로는 Path, 파일 정보는 File System, 파일 다루기는 Files)

     

    JAVA IO와 JAVA NIO의 차이

     

    NIO 클래스

     
    *Path
    package chap11.ex10.nio;
    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class PathExam {
    
    	public static void main(String[] args) {
    
    		// java nio 에서는 경로를 전문으로 담당하는 Path 클래스가 있다.
    		Path path = Paths.get("C:/img/img2.png"); // 특정 경로에 있는 파일을 가져옴
    		
    		System.out.println("특정 경로의 파일 이름 : " + path.getFileName());
    		System.out.println("부모 폴더 : " + path.getParent().getFileName());
    		System.out.println("루트 : " + path.getRoot());
    		
    		System.out.println("경로 단계 수 : " + path.getNameCount()); //2
    		for (int i = 0; i < path.getNameCount(); i++) {
    			System.out.println((i+1)+"단계 : " + path.getName(i));
    		}
    	}
    
    }
    package chap11.ex10.nio;
    
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class MakeDir {
    
    	public static void main(String[] args) throws Exception {
    
    		// C:/temp/nio
    		Path dir = Paths.get("C:/temp/nio");
    		if(Files.notExists(dir)) {
    			System.out.println("폴더 없음");
    			Files.createDirectories(dir);
    		}
    		
    		// C:/temp/nio/textFile.txt
    		Path file = Paths.get("C:/temp/nio/textFile.txt");
    		if(Files.notExists(file)) {
    			System.out.println("파일 없음");
    			Files.createFile(file);
    		}
    		
    	}
    
    }
     
    *Files

    FIles.createDirectory(file) : 폴더 만들기 (폴더가 여러 개 일 경우는 Directories)

    FIles.createFile(file) : 파일 만들기

     

    FIles.isDirectory(path) : 디렉토리 여부

    FIles.isRegularFile(path) : 파일 여부

    FIles.getLastModifiedTime(path) : 마지막 수정시간

    FIles.size(path) : 파일 크기

    FIles.getOwner(path) : 소유자

    FIles.isHidden(path) : 숨김 파일 여부

    FIles.isReadable(path) : 읽기 가능 여부

    FIles.isWritable(path) : 쓰기 가능 여부

    FIles.exists(path) : 파일 존재 여부

    FIles.notExists(path) : 파일 미존재 여부

     

    package chap11.ex10.nio;
    
    import java.io.IOException;
    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 {
    
    		// File에 대한 전문 클래스
    		// Files를 쓰기 위해서는 반드시 Path를 이용해서 경로를 지정해 줘야 한다.
    		Path path = Paths.get("C:/img/img2.png");
    		
    		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.exists(path));
    	
    	}
    
    }

     

    동기와 비동기의 차이

    동기는 줄을 세워 하나씩 처리하는 방식이고 비동기는 여러 개를 분업해서 동시에 처리하는 방식이다.

     

    Java NIO에서 쓰기 순서

    1. 파일 위치 지정

    2. 쓰기

    -> 스트림을 사용하지 않기 때문에 스트림 준비 과정과 자원 정리 과정이 필요없다.

     

    package chap11.ex11.rw;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    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 {
    
    		System.out.print("메세지를 입력 하세요 : ");
    		Scanner scan = new Scanner(System.in);
    		String txt = scan.nextLine()+ "\r\n";
    		System.out.println("입력 내용 : " + txt);
    		
    		// java io 에서 파일 쓰기 순서
    		
    		// 1. 파일 위치 지정
    		// 2. 스트림 준비 (주+보조)
    		// 3. 쓰기
    		// 4. 자원 정리 (flush, close)
    		
    		// java nio 파일 쓰기 순서
    		
    		// 1. 파일 위치 지정
    		Path path = Paths.get("C:/img/write.txt");
    		if(Files.notExists(path)) {
    			System.out.println("파일 없음");
    			Files.createFile(path);
    		}
    		
    		// 스트림 준비 과정 필요 없음
    		
    		// 2. 쓰기
    		Files.write(path, txt.getBytes("UTF-8"), StandardOpenOption.APPEND);
    		// APPEND : 파일 쓰기 시 파일의 끝에 내용을 추가한다.
    		// WRITE : 쓰기 모드 
    		// CREATE : 경로에 파일이 없으면 자동으로 생성
    		// CREATE_NEW : 이미 파일이 존재해도 파일 생성
    		// READ : 읽기 모드
    		
    		// DELETE_ON_CLOSE : 사용 후 삭제
    		// DSYNC : 파일 내용에 대한 모든 업데이트가 동기식으로 작성
    		// SYNC : 파일 내용 또는 메타데이터에 대한 업데이트가 동기식으로 작성
    		// SPARSE : 저장 방식(빈 공간을 header로 떼워서 압축)
    		// TRUNCATE_EXISTING : 파일이 이미 존재하고 WRITE 액세스 하기 위해 열린 경우 길이를 0으로 잘라낸다.
    		
    		// 자원 정리도 스트림이 없기 때문에 필요 없음
    		System.out.println("저장이 완료 되었습니다.");
    		
    	}
    
    }

     

    Java NIO에서 읽기 순서

    1. 파일 위치 지정

    2. 읽기

     

    package chap11.ex11.rw;
    
    import java.io.IOException;
    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 {
    
    		// java io 에서 파일 읽기 순서
    		
    		// 1. 파일 위치 지정
    		// 2. 스트림 준비(주+보조)
    		// 3. 가져오기
    		// 4. 자원 정리
    		
    		// java nio 에서 파일 읽기 
    		
    		// 1. 파일 위치 지정
    		Path path = Paths.get("C:/img/temp/test.txt");
    		
    		// 2. 읽기
    		List<String> lines = Files.readAllLines(path,Charset.forName("utf-8"));
    		for (String line : lines) {
    			System.out.println(line);
    		}
    	
    	}
    
    }

     

    Java NIO에서 복사(copy)할 땐 copy()를 통해 바로 복사 가능하다.

    - REPLACE_EXISTING : 이미 있는 파일이면 덮어쓴다 (이 옵션이 없으면 예외 발생)

    - COPY_ATTRIBUTE : 파일의 속성까지도 복사

     

    package chap11.ex11.rw;
    
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.nio.file.StandardCopyOption;
    
    import chap11.ex06.buffer.TimeChecker;
    
    public class FileCopyEx {
    
    	public static void main(String[] args) throws IOException {
    
    		// java io 방식 순서
    		
    		// 1. 파일 위치 지정 (읽어올 곳, 쓸 곳)
    		// 2. 스트림 준비 (input, output)
    		// 3. 가져오기
    		// 4. 쓰기
    		// 5. 자원 정리
    		
    		// java nio 방식 순서
    		
    		// 1. 파일 위치 지정 (읽어올 곳, 쓸 곳)
    		Path from = Paths.get("C:/img/img2.png");
    		Path to = Paths.get("C:/img/temp/copy.png");
    		
    		// 2. 가져오기 + 3. 쓰기 = 복사
    		TimeChecker chk = new TimeChecker();
    		chk.timeStart();
    		Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING);
    		System.out.println("java nio 걸린 시간 : " + chk.timeStop() + "ms"); //21ms
    		/*
    		 *REPLACE_EXISTING : 이미 있는 파일이면 덮어쓴다 (이 옵션이 없으면 예외 발생)
    		 *COPY_ATTRIBUTE : 파일의 속성까지도 복사 (권한, 읽기 전용, 최종 사용자 등..) 
    		 **/
    	}
    
    }
     

    'JAVA' 카테고리의 다른 글

    Network (TCP, UDP)  (0) 2022.10.07
    JAVA IO (데이터 입출력)  (0) 2022.10.07
    thread 2 (스레드 제어~스레드 풀)  (1) 2022.09.24
    thread - 1 (스레드 생성~join)  (1) 2022.09.24
    컬렉션 프레임워크(List, Set, Map)  (1) 2022.09.24
Designed by Tistory.