본문 바로가기

# 02/Java

[윤성우 열혈자바] 33-1. 파일 시스템

반응형

기본적인 파일 시스템 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);

   }

}



반응형