기본적인 파일 시스템 1
• 윈도우의 파일 경로를 나타내는 방식: 다수의 상위 디렉토리 가질 수 있음
C:\javastudy\simpe.java
( 예, C:, D:, E: 등 )
• 리눅스의 파일 경로를 나타내는 방식: 하나의 상위 디렉토리를 가짐
/javastudy/simple.java
기본적인 파일 시스템 2 : 절대 경로, 상대 경로
• 윈도우 절대 경로 C:\javastudy\simpe.java - 루트 디렉토리를 시작으로 파일 경로를 말함. 바뀔일이 없음.
• 리눅스 절대 경로 /javastudy/simple.java
• 윈도우 상대 경로 javastudy\simpe.java - 너의 부모는 누구니? 어디위치냐에 따라 달라짐. 루트 디렉토리가 없음.
• 리눅스 상대 경로 javastudy/simple.java
Paths와 Path 클래스
java.nio.file.Path
파일 및 디렉토리의 경로 표현을 위해 자바 7에서 추가된 인터페이스
ex) Path path = Paths.get("C:\\JavaStudy\\PathDemo.java"); - 실제 파일이 없을 수도 있음!
Path getRoot() // 루트 디렉토리 반환
Path getParent() // 부모 디렉토리 반환
Path getFileName() // 파일 이름 반환
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("Absolute: " + pt1);
System.out.println("Root: " + pt2);
System.out.println("Parent: " + pt3);
System.out.println("File: " + pt4);
}
Get 메소드 호출의 성공 여부는 해당 파일 또는 디렉토리의 존재 여부와 상관 없다.
현재 디렉토리 정보의 출력 예
class CurrentDir {
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("Current dir: " + cdir);
}
}
파일 및 디렉토리의 생성과 소멸
public static Path createFile(Path path, FileAttribute<?>...attrs) throws IOException
→ 지정한 경로에 빈 파일 생성, 경로가 유효하지 않거나 파일이 존재하면 예외 발생
public static Path createDirectory(Path dir, FileAttribute<?>...attrs) throws IOException
→ 지정한 경로에 디렉토리 생성, 경로가 유효하지 않으면 예외 발생
public static Path createDirectories(Path dir, FileAttribute<?>...attrs) throws IOException
→ 지정한 경로의 모든 디렉토리 생성
파일 및 디렉토리 생성의 예
public static void main(String[] args) throws IOException {
Path fp = Paths.get("C:\\JavaStudy\\empty.txt");
fp = Files.createFile(fp); // 파일 생성 - 경로가 유효하지 않으면 예외 발생
Path dp1 = Paths.get("C:\\JavaStudy\\Empty");
dp1 = Files.createDirectory(dp1); // 디렉토리 생성 - 경로가 유효하지 않으면 예외 발생
Path dp2 = Paths.get("C:\\JavaStudy2\\Empty");
dp2 = Files.createDirectories(dp2); // 경로의 모든 디렉토리 생성 - 경로가 유효하지 않으면 생성됨!
System.out.println("File: " + fp);
System.out.println("Dir1: " + dp1);
System.out.println("Dir2: " + dp2);
}
파일을 대상으로 하는 간단한 입력 및 출력
java.nio.file.Files의 메소드들(바이트 단위 입출력)
public static byte[] readAllBytes(Path path) throws IOException
public static Path write(Path path, byte[] bytes, OpenOption...options) throws IOException
• APPEND 파일의 끝에 데이터를 추가한다.
• CREATE 파일이 존재하지 않으면 생성한다.
• CREATE_NEW 새 파일을 생성한다. 이미 파일이 존재하면 예외 발생
• TRUNCATE_EXISTING 쓰기 위해 파일을 여는데 파일이 존재하면 파일의 내용을 덮어쓴다.
I/O 스트림을 기반으로 하는 방법에 비해 매우 단순하고 간단한 방법, 따라서 입출력할 데이터의 양이 적고 성능이 문제되지 않는 경우에 한해 이 방법 사용해야 한다.
- 코드레벨에서 간단해짐. 열고닫기안해도 됨. 쓰기편한거지 빠른건 아님. 기능제한있음(버퍼링 등)
간단한 입력 및 출력의 예(바이트 단위)
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}; // 파일에 쓸 데이터
for(byte b : buf1) // 저장할 데이터의 출력을 위한 반복문
System.out.print(b + "\t");
System.out.println();
// 파일에 데이터 쓰기
Files.write(fp, buf1, StandardOpenOption.APPEND);
// 파일로부터 데이터 읽기
byte buf2[] = Files.readAllBytes(fp);
for(byte b : buf2) // 읽어 들인 데이터의 출력을 위한 반복문
System.out.print(b + "\t");
System.out.println();
}
파일 open, close 과정 없음
데이터 읽을 때 배열도 준비해 둘 필요가 없음. 편리함!! 간단할때 사용하면 좋음.
문자 데이터의 간단한 입력 및 출력
java.nio.file.Files의 메소드들(문자열 단위 입출력)
public static List<String> readAllLines(Path path) throws IOException
public static Path write(
Path path,
Iterable<? extends CharSequence> lines,
OpenOption...options
) throws IOException
Iterable<E> 인터페이스를 Collection<E> 인터페이스가 상속한다.
CharSequence 인터페이스를 String 클래스가 구현한다.
String st1 = "One Simple String";
String st2 = "Two Simple String";
List<String> lst = Arrays.asList(st1, st2); // write 메소드의 두 번째 인자로 전달 가능
문자 데이터의 간단한 입력 및 출력의 예
class SimpleTxtWriteRead {
public static void main(String[] args) throws IOException {
Path fp = Paths.get("C:\\JavaStudy\\simple.txt");
String st1 = "One Simple String";
String st2 = "Two Simple String";
List<String> lst1 = Arrays.asList(st1, st2);
Files.write(fp, lst1); // 파일에 문자열 저장하기
List<String> lst2 = Files.readAllLines(fp); // 파일로부터 문자열 읽기
System.out.println(lst2);
}
}
파일 및 디렉토리의 복사와 이동
public static Path copy(
Path source, Path target, CopyOption...options) throws IOException
• REPLACE_EXISTING 이미 파일이 존재한다면 해당 파일을 대체한다.
• COPY_ATTRIBUTES 파일의 속성까지 복사를 한다.
public static Path move(
Path source, Path target, CopyOption...options) throws IOException
• REPLACE_EXISTING 이미 파일이 존재한다면 해당 파일을 대체한다.
파일 및 디렉토리의 복사와 이동의 예
class CopyFileFromFiles {
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);
}
}
class MoveFileFromFiles {
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);
}
}
'# 02 > Java' 카테고리의 다른 글
[윤성우 열혈자바] 33-3. NIO 기반의 입출력 (0) | 2019.10.28 |
---|---|
[윤성우 열혈자바] 33-2. NIO.2 기반의 I/O 스트림 생성 (0) | 2019.10.28 |
[윤성우 열혈자바] 32-4. I/O 스트림 기반의 인스턴스 저장 (0) | 2019.10.28 |
[윤성우 열혈자바] 32-3. 문자 스트림의 이해와 활용 (0) | 2019.10.28 |
[윤성우 열혈자바] 32-2. 필터 스트림의 이해와 활용 (0) | 2019.10.28 |