▸JAVA/라이브러리(API)

java.nio.file.Files 주요 메소드 [1/1]

코데방 2019. 12. 16.
728x90

[ Files 클래스 ]

  • Static 메소드로 구성되어 있음
  • Path 객체를 이용해 파일 시스템 작업 수행

데이터 입출력에 대한 기본 개념은 아래 링크글을 참조하시면 됩니다.

 

2019/12/16 - [JAVA/기본 문법] - 외부 데이터 입출력_io / nio / nio2 [1/3]

2019/12/16 - [JAVA/기본 문법] - 외부 데이터 입출력_java.io [2/3]

2019/12/16 - [JAVA/기본 문법] - 외부 데이터 입출력_java.nio [3/3]

 


 

[ 생성자 ]

  • 모두 Static 메소드로 이루어져 있어 별도의 인스턴스 생성이 없음
  • 파일 또는 폴더의 주소 정보를 가진 Path 클래스의 인스턴스를 매개변수로 메소드 수행

 

boolean isDirectory(Path p) - 폴더인지 아닌지 검사
boolean exists(Path p) - 파일이 실제 존재하는지 검사
Path createDirectory(Path p) - 디렉토리 생성
Path createFile(Path p) - 파일 생성 (이미 해당 파일 있으면 예외 발생)
package study.first;

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

public class Main {
	public static void main(String[] args) {

		File fi = new File("C:\\JAVA\\Test\\input2.txt");
		Path dir = Paths.get("C:\\JAVA\\Test"); // 주소 객체
		Path file = Paths.get("C:\\JAVA\\Test\\input.txt"); // 파일명 객체
		Path file2 = fi.toPath(); // File->Path 변환
		File fi2 = file.toFile(); // Path->File 변환

		try {

			if (!Files.isDirectory(dir)) { // 해당 디렉토리가 없다면

				Files.createDirectories(dir); // 폴더 생성
			}

			if (!Files.exists(file)) { // 해당 파일이 없다면

				Files.createFile(file); // 해당 주소에 파일 생성
			}

		} catch (Exception e) {

			System.out.println("파일 작업 실패");
		}
	}
}

 


[ StandardCopyOption ]

copy, move와 같은 메소드를 사용할 때 옵션을 줄 수 있는 기본 라이브러리의 Enum(열거형) 클래스입니다. 옵션은 여러개를 동시에 줄 수 있습니다.

 

ATOMIC_MOVE의 원자적 이동이란 파일 이동 중에 어떠한 방해가 생기더라도 이동 작업을 끝까지 보장한다는 의미입니다. 즉, 파일 이동 중에 어떤 프로세스가 간섭해서 중단명령을 내려도(interrupt) 이를 무시하고 이동을 완료한 뒤 대응합니다.

 

예를 들어 멀티 스레드 환경에서는 다른 스레드를 강제 중단시키는 interrupt 기능을 사용할 수 있습니다. 원래 interrupt가 발생하면 스레드가 바로 중단돼야 하지만 파일 전송의 경우 끊기면 문제가 발생할 수 있기 때문에 전송이 다 될 때까지 스레드를 중단시키지 않는 것입니다. 

 

ATOMIC_MOVE - move 전용, 원자적 이동을 보장복사
COPY_ATTRIBUTES - 모든 파일 속성(File Attributes)을 복사
REPLACE_EXISTING - Dest 파일이 이미 존재하면 파일의 내용을 복사해서 덮어씀

 


 

long copy(Path source, Path dest. CopyOption) - source 파일을 dest 경로로 복사 (동일 파일 있으면 예외 발생)
- 동일 파일 있으면 내용 덮어쓰기 등 CopyOption 사용 가능
package study.first;

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

public class Main {
	public static void main(String[] args) {

		Path file = Paths.get("C:\\JAVA\\Test\\input.txt"); // 파일명 객체
		Path file2 = Paths.get("C:\\JAVA\\Test\\input2.txt"); // 파일명 객체

		try {

			// 이미 있으면 예외 발생하기 때문에 조건 지정
			if (!Files.exists(file2)) // file2가 없으면
				Files.copy(file, file2); // file을 복사해서 file2로 새로 만듦

			// 없으면 복사해서 만들고, 이미 있으면 내용을 덮어씀
			Files.copy(file, file2, StandardCopyOption.REPLACE_EXISTING);

		} catch (Exception e) {

			System.out.println("파일 작업 실패");
		}
	}
}

 


 

Path move(Path source, Path dest. CopyOption) - source 파일을 dest 경로로 이동
- source 파일이 없거나 dest 파일이 이미 있으면 예외 발생
- 두 경로가 동일하다면 source 파일의 이름을 dest로 변경
- dest 파일이 있더라도 덮어쓰는 등 CopyOption 사용 가능
package study.first;

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

public class Main {
	public static void main(String[] args) {

		Path file = Paths.get("C:\\JAVA\\Test\\input.txt"); // 파일명 객체
		Path file2 = Paths.get("C:\\JAVA\\Test\\input2.txt"); // 파일명 객체

		try {

			// file(source) 있고 file2와 경로 같으면 file2로 이름 변경
			// file(source) 있고 file2와 경로 다르면 file2 경로로 이동
			// file(source) 없거나 file2(dest)가 이미 있으면 예외 발생
			if(!Files.exists(file2))      // file2(dest)가 없다면
				Files.move(file, file2);  // file을 복사 또는 이름 바꾸기
			
			// file2(dest)가 이미 존재하더라도 지우고 file(source)의 이름을 바꿔줌
			Files.move(file, file2, StandardCopyOption.REPLACE_EXISTING);
			
			

		} catch (Exception e) {

			System.out.println("파일 작업 실패");
		}
	}
}

 


 

Files 클래스에는 너무 많은 static 메소드가 있고, 사용법도 매우 복잡한 편입니다. 일단 import 하는 순간 모든 static 메소드가 다 메모리에 올라오기 때문에 간단한 파일 시스템 작업은 그냥 java.io.File 클래스를 사용해서 하고, 복잡한 파일 시스템 작업이 많이 필요할 때 java.nio.file.Files 클래스를 사용하는 것이 좋을 듯합니다. 필요할 때는 왼쪽 사이드바 링크에 있는 Java SE API문서를 참조하시면 됩니다. 쓰다가 유용한 기능 있으면 추가해둘게요. 너무 많아요..

728x90

댓글

💲 추천 글