[자바]/자바 문법

[JAVA] 파일 시스템, NIO

쿠릉쿠릉 쾅쾅 2021. 12. 2. 10:12
728x90

 

 

Path 클래스 메서드

Path getRoot() : 루트 디렉토리 반환

Path getParent() : 부모 디렉토리 반환

Path getFileName() : 파일 이름 변환

boolean isAbsolute() : 절대경로면 true, 상대경로면 false 반환

Path toAbsolutePath() : 절대경로를 나타내는 Path 객체로 반환

 

 

Paths 클래스 메서드

static Path get(URL url) : 지정된 URL를 Path 개체로 변환. Path 객체 생성할 때 쓰임

 

 

예제1

import java.nio.file.Path;
import java.nio.file.Paths;

Class PathDemo{
    public static void main(String[] args){
        

        Path pt1 = Paths.get("C:\\JavaStudy\\PathDemo.java");
        Path pt2 = pt1.getRoot();
        Path pt3 = pt1.getParent();
        Path pt4 = pt1.getFileName();
        
        System.out.println(pt1);  // C:\JavaStudy\PathDemo.java
        System.out.println(pt2);  // C:\
        System.out.println(pt3);  // C:\JavaStudy
        System.out.println(pt4);  // PathDemo.Java

    }

}

 

 

예제2 ㅡ 현재 작업중인 파일의 상대 경로를 절대경로로 바꾸기

import java.nio.file.Path;
import java.nio.file.Paths;

public class Prac {

	public static void main(String[] args) {
		
		// 현재 디렉토리 정보를 '상대경로' 형태로 담긴 인스턴스 생성
		Path cur = Paths.get("");
		String cdir;
		
		if(cur.isAbsolute()) cdir = cur.toString();
		else cdir = cur.toAbsolutePath().toString();
		
		System.out.println(cdir);


	}

}

 

 

 

Files 클래스 메서드

static Path createFile(Path path, FileAttribute<?>... attrs) throws IOException
: 지정한 경로에 빈 파일 생성, 경로가 유효하지 않거나 파일이 존재하면 예외 발생

static Path createDirectory(Path path, FileAttribute... attrs) throws IOException
: 지정한 경로에 디렉토리 생성, 경로가 유효하지 않으면 예외 발생

static Path createDirectories(Path path, FileAttribute... attrs) throws IOException
: 지정한 경로의 모든 디렉토리 생성

 

파일을 대상으로 하는 간단한 입출력 (Files 클래스 메서드)

  • open, close 과정이 없음
  • 단순하고 코드 간결 (I/O스트림에 비해 성능이 뛰어난건 아님)
  • 데이터양이 적고 성능 문제가 없을 경우 사용할 것

 

static Path write(Path path, byte[] bytes, OpenOption... options) throws IOExceptions
: 파일에 바이트를 씀
가변인자에 들어갈 옵션 인자들:

  • StandardOpenOption.READ : 읽기 전용 파일 열기
  • StandardOpenOption.WRITE : 쓰기 전용 파일 열기
  • StandardOpenOption.APPEND : 파일의 끝에 데이터 추가 (WRITE, CREATE와 함께 사용 가능)
  • StandardOpenOption.CREATE : 파일이 존재하지 않으면 생성
  • StandardOpenOption.CREATE_NEW : 새 파일 생성. 이미 존재하는 파일이면 예외 발생
  • StandardOpenOption.TRUNCATE_EXISTING : 쓰기 위해 파일을 여는데 파일이 존재하면 파일의 내용을 덮음(WRITE와 함께 사용 가능)
  • StandardOpenOption.DELETE_ON_CLOSE : 스트림을 닫을 때 파일 삭제 (임시파일 삭제할 때 이용)

 

static Path write(Path path, Iterable<? extends CharSequnece> lines, OpenOption... options)
: 파일에 바이트를 씀

  • Iterable<E> 인터페이스를 Collection<E> 인터페이스가 상속 받음
    • Collection 요소의 문자열들만 저장이 됨
  • CharSequnece 인터페이스를 String 클래스가 구현

 

static btye[] readAllBytes(Path path) throws IOException
: 파일의 모든 바이트를 읽음.

static List<String> readAllLines(Path path) throws IOException
: 줄 단위로 읽음

static Path copy(Path source, Path target, CopyOption... options) throws IOException
: 매개변수 source 파일을 target 파일로 복사
가변인자에 들어갈 옵션 인자들:

  • StandardCopyOption.REPLACE_EXISTING : 이미 파일이 존재한다면 해당 파일을 대체
  • StandardCopyOption.COPY_ATTRIBUTES :  파일의 속성까지 복사

 

static Path move(Path source, CopyOption... options) throws IOException
: 매개변수 sourve 파일을 target 파일로 이동
가변인자에 들어갈 옵션 인자들:

  • StandardCopyOption.REPLACE_EXISTING : 이미 파일이 존재한다면 해당 파일을 대체

 

예제1

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Prac {
	public static void main(String[] args) throws IOException{
		
		Path fp = Paths.get("C:\\JavaStudy");
		fp = Files.createFile(fp); // 파일 생성
		
		Path dp1 = Paths.get("C:\\JavaStudy\\Empty");
		dp1 = Files.createDirectory(dp1);  // 디렉토리 생성
		
		Path dp2 = Paths.get("C:\\JavaStudy\\Java");
		dp2 = Files.createDirectories(dp2);  // 경로의 모든 디렉토리 생성 

	}

}

 

 

예제2 ㅡ 파일을 대상으로 하는 간단한 입출력

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class Prac {
	public static void main(String[] args) throws IOException{
		Path fp = Paths.get("C\\JavaStudy\\simple.bin");
		
		// 파일 생성. 파일이 존재하면 예외 발생
		fp = Files.createFile(fp);
		
		byte[] buf1 = {0x13, 0x14, 0x15};  // 파일에 쓸 데이터
		
		// 파일 데이터 쓰기
		Files.write(fp, buf1, StandardOpenOption.APPEND);

		// 파일로부터 데이터 읽기
		byte[] buf2 = Files.readAllBytes(fp);
		
		// 읽어 들인 데이터의 출력을 위한 반복문
		for(byte b: buf2)  
			System.out.print(b + " ");
		System.out.println();

		
	}

}

I/O스트림을 기반으로 하는 방법에 비해 매우 단순하고 간단한 방법. 따라서 입력할 데이터의 양이 적고 성능이 문제되지 않는 경우에 한해 이 방법을 사용할 것.

 

예제3

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;

public class Prac {

	public static void main(String[] args) throws IOException{
		Path fp = Paths.get("C:\\JavaStudy\\simple.txt");
		String str1 = "One Simple String";
		String str2 = "Two Simeple String";
		List<String> lst1 = Arrays.asList(str1, str2);
		
		// 파일에 문자열 저장
		Files.write(fp, lst1);  
		
		// 파일로부터 문자열 읽기
		List<String> lst2 = Files.readAllLines(fp);  
		
		System.out.println(lst2);  // [One Simple String, Two Simple String]
		
	}

}

 

 

예제4 ㅡ 파일 및 디렉토리의 복사

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class Prac {
	public static void main(String[] args) throws IOException{
		Path src = Paths.get("C:\\JavaStudy\\CopyFileFromFiles.java");
		Path dst = Paths.get("C:\\JavaStudy\\CopyFileFromFiles2.java");

		// src가 지시하는 파일을 dst가 지시하는 위치와 이름으로 복사
		Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING);
	}

}

 

 

예제5 ㅡ 파일 및 디렉토리 이동

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class Prac {
	public static void main(String[] args) throws IOException{
		Path src = Paths.get("C:\\JavaStudy\\Dir1");
		Path dst = Paths.get("C:\\JavaStudy\\Dir2");

		// src가 지시하는 디렉토리를 dst가 지시하는 디렉토리로 이동
		Files.move(src, dst, StandardCopyOption.REPLACE_EXISTING);
	}

}

 

728x90