yoni

[20][IO] IO(입출력), File 클래스 다루기, 파일 이동, 디렉토리 조작, 파일 목록 본문

java of educational by contents

[20][IO] IO(입출력), File 클래스 다루기, 파일 이동, 디렉토리 조작, 파일 목록

yoni-1117 2018. 12. 2. 17:15

[01] IO(Input Output) Stream 
   - 프로그램이 가지고 있는 또는 가지고 있지 않은 데이터를 외부(다른 프로그램)로
     보내거나 가져오는 동작을 말합니다. 

   - Program에서 출력 ---------------> 모니터, 디스크 장치, 네트워크, USB, Bluetooth 
                               출력 스트림    System     File          Socket   File   Socket

   - 키보드, 디스크 장치, 네트워크, USB, Bluetooth  ---------------> Program 
      입력       File           Socket   File    Socket      입력 스트림 

      

   - 입출력 Stream은 FIFO(First In First Out, 지하철 표를내고 들어가는 
     출입구와 비슷한 구조입니다.(Queue 구조) 

      

   - 데이터 송수신시 네트워크는 1KB, 4 KB등 데이터를 모아서 전송합니다.
     그 이유는 전송되는 데이터에대한 메타(구조) 데이터도 전송되기때문에 효율이 낮은 경우
     5바이트 전송에 메타데이터는 50 바이트가 전송될 수도 있습니다.
   - 스트림은 단방향 구조입니다. 따라서 오로지 출발지와 목적지를 지정하면 
     한곳으로만 데이터가 전송됩니다. 
     서로 네트워크가 연결되면 Pipeline이 설정되어 보내고 받는 2개의 객체(통로)가 만들어짐. 
     예) 파일 쓰기 객체, 파일 읽기 객체 / 전송 객체, 수신 객체

   
   - 스트림은 전송하려는 데이터가 많을 경우 지연시간이 발생합니다. 
     전철의 지연 운행과 비슷한 동작을 함.
     . 전송 제어: 고속 장치와 저속장치가 있는 경우 송수신 장치가 저속으로
                     송수신되어 데이터 유실이 발생되지 않도록 함. 
     예) LAN에서 드라이버를 설치하기 때문에 전력에 따라 전송되는 차이가 있어도 

데이터 유실을 방지함


   - 한글 입출력을 위해서는 문자(Reader, Writer) 스트림을 사용해야 합니다. 

      
     바이트 단위 처리                                         2바이트 문자단위 
     (한글 처리 불가능)                                        (한글 조합 기능) 
     ----------------------------------------------------------------------------------------- 
     InputStream             기본 입력 스트림            Reader(*)         한글 입출 
     OutputStream          기본 출력 스트림             Writer(*)          한글 출력

     FileInputStream         파일 입력 스트림            FileReader(*)     한글 파일 입력 
     FileOutputStream      파일 출력 스트림             FileWriter(*)      한글 파일 출력

     BufferedInputStream   버퍼(Memory) 입력         BufferedReader(*) 한글 메모리에 입력
     BufferedOutputStream 버퍼(Memory) 출력         BufferedWriter(*)  한글 메모리에 출력

     DataInputStream       데이터 타입 지원 입력 
     DataOutputStream     데이터 타입 지원 출력 

     ObjectInputStream     Class 타입단위 입력 제공 
     ObjectOutputStream   Class 타입단위 출력 제공 
  


1. 파일 다루기
   - URL: http://soldeskit3.cafe24.com/pds/read.jsp?pdsgrpno=10&pdsno=7853&col=&word=¤tPage=0&visible=

   - 자료실에서 견본 이미지를 다운받습니다. 'C:/홈 폴더/swiss' 폴더에 저장합니다.

1) File 
   - 파일, 디렉토리에 대한 정보를 제공하고 조작(생성, 이름 변경, 삭제, 크기등)
     할 수 있는 클래스. 
   - Windows는 대소문자를 구분하지 않으나 Linux/Unix는 철저 구분함으로 
     대소 문자를 구분하여 처리합니다.
   - 파일 생성시 대상 폴더가 미리 생성되어 있어야합니다.
     실습용 'C:/홈 폴더/io' 폴더를 미리 생성합니다.


[실행 화면]

1. 파일이 존재합니다. ← 파일이 없으면 "파일이 존재하지 않습니다." 출력
2. 순수 파일명: sw01.jpg
3. 파일의 크기: 270377
4. 절대 경로: C:/Home 폴더/swiss/sw01.jpg
5. 현재 폴더: C:/Home 폴더/swiss
6. 파일인지 검사: true
7. 파일명 변경: true ← 최초 1번만 true가 발생 
8. 파일 삭제: true    ← sw01_x.jpg 삭제, 최초 1번만 true가 발생
9. 이미지 파일입니다.
10. 파일 생성: false   ← 1번만 true가 발생, 파일이 존재하면 false 리턴
11. 파일이 이동되었습니다.
 
▷ oop3.FileTest.java 

-----------------------------------------------------------------------------------

package oop3;
 
import java.io.File;
import java.io.IOException;
 
public class FileTest {
 
  public static void main(String[] args) {
    File file = new File("C:/201812_java/swiss/sw01.jpg"); // 절대 경로
    
    if (file.exists()) {
      System.out.println("1. 파일이 존재합니다.");
    }
    
    System.out.println("2. 순수 파일명: " + file.getName());
    System.out.println("3. 파일 크기: " + file.length());
    System.out.println("4. 절대 경로: " + file.getAbsolutePath());
    
    String path = file.getParent();
    System.out.println("5. 현재 폴더: " + path);
    
    System.out.println("6. 파일인지 검사: " + file.isFile());
    
    File src = new File("C:/201812_java/swiss/sw02.jpg"); // 절대 경로
    File dest = new File("C:/201812_java/swiss/sw02_x.jpg"); // 절대 경로
    boolean sw = src.renameTo(dest);
    System.out.println("7. 파일명 변경: " + sw);
    
    File fdel = new File("C:/201812_java/swiss/sw02_x.jpg"); // 절대 경로
    System.out.println("8. 파일 삭제: " + fdel.delete());
    
    File file2 = new File("C:/201812_java/swiss/sw03.jpg");
    // 파일 확장자만 산출
    int point = file2.getName().lastIndexOf(".");
    String ext = file2.getName().substring(point+1);
    System.out.println("9. ext: " + ext);
    
    String name = file2.getName().toLowerCase();
    if (name.endsWith(".jpg") || name.endsWith(".png") || name.endsWith(".gif")) {
      System.out.println("10. 이미지 파일입니다.");
    }
    
    File file3 = new File("C:/201812_java/io/data.txt");
    try {
      System.out.println("11. 파일 생성: " + file3.createNewFile());
    } catch (IOException e) {
      e.printStackTrace();
    }
    
    File src2 = new File("C:/201812_java/swiss/sw05.jpg"); // 절대 경로
    File dest2 = new File("C:/201812_java/io/sw05.jpg"); // 절대 경로
    // 파일명이 변경되어 이동
    // File dest2 = new File("C:/201812_java/io/sw05_2.jpg"); // 절대 경로
    sw = src2.renameTo(dest2);  // 폴더가 다르면 이동
    
    if (dest2.exists()) {
      System.out.println("12. 파일 이동");  
    }
    
  }
  
}
 
  
  
-----------------------------------------------------------------------------------

  
  
  
[02] 폴더 생성 및 이름 변경 및 삭제
- mkdir(): 부모 폴더 아래 최하위 폴더 하나만 생성
- mkdirs(): 경로상에 명시된 부모 폴더를 포함하여 모든 폴더를 생성
- src.renameTo(dest): 폴더가 존재하면 폴더명을 변경하지 않음,
  커서가 변경할 폴더안에 있으면 Rock이 잠겨 변경 불가능함.
- delete(): 폴더나 파일 즉시 삭제, 하위 폴더가 있으면 삭제 안됨.
- deleteOnExit(): 프로그램(JVM) 종료시 삭제, 임시 폴더의 사용

[실행 화면]


1. 폴더 생성: true     ← 최초 한번만 true
2. 폴더 생성: true     ← 최초 한번만 true
3. 폴더명 변경: true  ← 최초 한번만 true, 탐색기에서 test 폴더를 선택하면 Lock이 걸림으로 닫은 후 실습
4. 폴더 삭제: false
4. 폴더 삭제: false
4. 폴더 삭제: false
4. 폴더 삭제: true
5. 파일 목록

sw03.jpg(71986)
sw04.jpg(411556)
sw05.jpg(147686)
sw06.jpg (210382)
sw07.jpg (581899)
sw08.jpg (514544)
sw09.jpg (70609)
.....
 

▷ oop3.Folder.java
-----------------------------------------------------------------------------------

package oop3;
 
import java.io.File;
 
public class Folder {
 
  public static void main(String[] args) {
    File folder = new File("C:/201812_java/test");
    boolean sw = folder.mkdir();
    if (sw = true)
    System.out.println("1. 폴더 생성: " + sw);
 
    folder = new File("C:/201812_java/test/korea/seoul/jongro/street1");
    System.out.println("2. 하위 폴더 생성: " + folder.mkdirs());
    
    File src = new File("C:/201812_java/test");//절대경로
    File dest = new File("C:/201812_java/test2");
    sw = src.renameTo(dest);//탐색기에서 test를 접근하지 않은 형태여야지만 test를 바꿀 수있는 권한이 생김 
    
    System.out.println("3. 폴더명 변경: " + sw );
    
    folder = new File("C:/201812_java/test/korea/seoul/jongro/street1");
    System.out.println("4. 폴더 삭제: " + folder.delete());
    System.out.println("4. 폴더 삭제: " + new File("C:/201812_java/test/korea/seoul/jongro").delete());//이름이없는 무명객체를 사용하는 방법
    
    System.out.println("5. 파일 목록");
    File swiss = new File("C:/201812_java/swiss");
    File[] files = swiss.listFiles();
    
    for (int i = 0; i < files.length; i++){
      File file = files[i]; 
      System.out.println(file.getName() + "(" + file.length() + ")");
    }
    
  }
 
}
 
 
 

-----------------------------------------------------------------------------------



[과제] 아래의 메소드를 이용하여 파일 단위가 출력되도록 해주세요.

1. Math.ceil(): 가장 가까운 1의자리수로 소수점을 반올림.  
 
[실행 화면]

2.0
1.0
1.0
-1.0
-0.0
-0.0
 
▷ oop3.Ceil.java 

-----------------------------------------------------------------------------------

package oop3;
 
public class Ceil {
 
  public static void main(String[] args) {
    System.out.println(Math.ceil(1.5));
    System.out.println(Math.ceil(0.1));
    System.out.println(Math.ceil(0.001));
    
    System.out.println(Math.ceil(-1.5));
    System.out.println(Math.ceil(-0.1));
    System.out.println(Math.ceil(-0.001));
  }
}
 
 //객체를 만들지 않고 메소드를 호출할 수 있다. static 메소드 단순한 조작일때 스테틱 메소드들을 많이 쓰임
 
-----------------------------------------------------------------------------------

  
  
2. 큰 정수의 처리
- 21억이 넘어가는 수는 Long 형식으로 처리해야함.
 
▷ IntTest.java
-----------------------------------------------------------------------------------

package oop3;
 
public class IntTest {
 
  public static void main(String[] args) {
    System.out.println(1024); // 1 KB ~
    System.out.println(1024 * 1024); // 1 MB ~
    System.out.println(1024 * 1024 * 1024); // 1 GB ~ 
    System.out.println(1024 * 1024 * 1024 * 1024); // 1 TB ~
    System.out.println("---------------------------------");
    System.out.println(1024L * 1024 * 1024 * 1024); // 1 TB ~ long 형식으로 형변환 해주는거다 
    System.out.println(1024L * 1024 * 1024 * 1024 * 1024); // 1 PB ~
  }
 
}
 
 

-----------------------------------------------------------------------------------
 
 
3. 파일 단위의 출력

[실행 화면]


sw03.jpg(71 KB)
sw04.jpg(174 KB)
sw05.jpg(504 KB)
sw06.jpg(206 KB)
sw07.jpg(569 KB)
sw08.jpg(503 KB)
.....

 
 
3. 파일 단위의 출력

[실행 화면]


sw03.jpg(71 KB)
sw04.jpg(174 KB)
sw05.jpg(504 KB)
sw06.jpg(206 KB)
sw07.jpg(569 KB)
sw08.jpg(503 KB)
.....


▷ oop3.Tool.java 
-----------------------------------------------------------------------------------
package oop3;
 
public class Tool {
  /**
   * 수를 전달받아 자료의 단위를 적용합니다.
   * @param size
   * @return 1000 > 1000 Byte
   */
  public String unit(long size){
    String str = "";
    
    if (size < 1024){ // 1 KB 이하
      str = size + " Byte";
    }else if (size < 1024 * 1024){ // 1 MB 이하
      str = (int)(Math.ceil(size/1024.0)) + " KB";
    }else if (size < 1024 * 1024 * 1024){ // 1 GB 이하
      str = (int)(Math.ceil(size/1024.0/1024.0)) + " MB";
    }else if (size < 1024L * 1024 * 1024 * 1024){ // 1 TB 이하
      str = (int)(Math.ceil(size/1024.0/1024.0/1024.0)) + " GB";
    }else if (size < 1024L* 1024 * 1024 * 1024 * 1024){ // 1 PT 이하
      str = (int)(Math.ceil(size/1024.0/1024.0/1024.0/1024.0)) + " TB";
    }else if (size < 1024L* 1024 * 1024 * 1024 * 1024 * 1024){ // 1 EX 이하
      str = (int)(Math.ceil(size/1024.0/1024.0/1024.0/1024.0/1024.0)) + " PT";
    }
    
    return str;
  }
 

 
 
-----------------------------------------------------------------------------------

 
▷ Folder2.java, Folder.java 복사하여 사용합니다.
-----------------------------------------------------------------------------------

package oop3;
 
import java.io.File;
 
public class Folder2{
 
  public static void main(String[] args) {
    File swiss = new File("C:/201812_java/swiss");
    File[] files = swiss.listFiles();
    Tool tool = new Tool();
    
    for (int i = 0; i < files.length; i++){
      File file = files[i];
      System.out.println(file.getName() + "(" + tool.unit(file.length()) + ")");
      }
    
    System.out.println("------------------------------------------");
    String ext = tool.getExt("C:/201812_java/swiss/sw06.jpg");
    System.out.println("1. 해당파일 확장자(ext): " + ext);
    
    
    }
}
 
  
-----------------------------------------------------------------------------------
 
 
▷ IOExam.java
-----------------------------------------------------------------------------------

package oop3;
 
import java.io.File;
 
public class IOExam {
 
  public static void main(String[] args) {
 
    .....
 
    
  }
 
}
 
  
-----------------------------------------------------------------------------------
 
 
 
[과제2] 파일 경로를 문자열로 전달받아 파일의 확장자를 추출하여 리턴하는 메소드를 제작 할 것.
- 메소드명: public ..... getExt1(.....
 
 
 
[과제3] 파일 객체를 만들어 파일의 확장자를 추출하여 리턴하는 메소드를 제작 할 것.
- 메소드명: public ..... getExt2(.....
  
   
  
[과제4] 파일 객체를 만들어 파일 존재 여부 확인후 파일의 확장자를 추출하여
           리턴하는 메소드를 제작 할 것.
- 메소드명: public ..... getExt2(.....
 
  
 
[과제5] 파일이 이미지인지를 확인하여 boolean 타입을 리턴하는 메소드를 제작 할 것.
- 메소드명: public ..... isImage(.....




package oop3;


import java.io.File;


public class Tool {

  /**

   * 수를 전달받아 자료의 단위를 적용합니다.

   * @param size

   * @return 1000 > 1000 Byte

   */

  public String unit(long size){

    String str = "";

    

    if (size < 1024){ // 1 KB 이하

      str = size + " Byte";

    }else if (size < 1024 * 1024){ // 1 MB 이하

      str = (int)(Math.ceil(size/1024.0)) + " KB";

    }else if (size < 1024 * 1024 * 1024){ // 1 GB 이하

      str = (int)(Math.ceil(size/1024.0/1024.0)) + " MB";

    }else if (size < 1024L * 1024 * 1024 * 1024){ // 1 TB 이하

      str = (int)(Math.ceil(size/1024.0/1024.0/1024.0)) + " GB";

    }else if (size < 1024L* 1024 * 1024 * 1024 * 1024){ // 1 PT 이하

      str = (int)(Math.ceil(size/1024.0/1024.0/1024.0/1024.0)) + " TB";

    }else if (size < 1024L* 1024 * 1024 * 1024 * 1024 * 1024){ // 1 EX 이하

      str = (int)(Math.ceil(size/1024.0/1024.0/1024.0/1024.0/1024.0)) + " PT";

    }

    

    return str;

  }

  

  /**

   * 문자열을 전달받아 파일 확장자 추출

   * @param path

   * @return

   */

  public String getExt1(String path) {

    int point = path.lastIndexOf(".");

    String ext = path.substring(point+1);

    

    return ext;

  }

  

  /**

   * 문자열을 전달받아 파일 객체를 만든후 확장자 추출

   * @param path

   * @return

   */

  public String getExt2(String path) {

    File file2 = new File(path);

    // 파일 확장자만 산출

    int point = file2.getName().lastIndexOf(".");

    String ext = file2.getName().substring(point+1);

    

    return ext;

  }

  

  /**

   * 문자열을 전달받아 파일 객체를 만든후 파일 존재 확인후 확장자 추출

   * @param path

   * @return

   */

  public String getExt3(String path) {

    // File file = new File("."); // .: 현재 폴더

    // System.out.println("path: " + file.getAbsolutePath()); // eclipse project 경로

    

    // File file2 = new File(path);

    File file2 = new File("C:/201812_java/swiss/" + path);

    int point = 0;

    String ext = "";

    

    if (file2.exists()) {

      // 파일 확장자만 산출

      point = file2.getName().lastIndexOf(".");

      ext = file2.getName().substring(point+1);

    }

    

    return ext;

  }

  

  public boolean isImage(String path) {

    boolean sw = false; // 스위치 변수

    String name = path.toLowerCase();

    if (name.endsWith(".jpg") || name.endsWith(".png") || name.endsWith(".gif")) {

      sw = true;

    }

    

    return sw;

  }


 

-------------------------------------------------------------------------------

//[출력부분]

package oop3;


import java.io.File;


public class IOExam {


  public static void main(String[] args) {

    File swiss = new File("C:/201812_java/swiss");

    File[] files = swiss.listFiles(); // 파일 목록 추출

    Tool tool = new Tool();

    

    for (int i=0; i < files.length; i++) {

      File file = files[i];

      System.out.println(file.getName() + "(" + tool.unit(file.length()) + ")");

    }

    System.out.println("-----------------------------------");

    String ext = tool.getExt1("C:/201812_java/swiss/sw06.jpg");

    System.out.println("1. ext: " + ext);


    ext = tool.getExt2("sw06.jpg");

    System.out.println("2. ext: " + ext);

    

    ext = tool.getExt3("sw06.jpg");

    System.out.println("3. ext: " + ext);

    

    System.out.println("4. 이미지 검사: " + tool.isImage("sw06.jpg"));

    

  }


}

---------------------------------------------------

//[결과]

sw02_x.jpg(206 KB)

sw03.jpg(71 KB)

sw04.jpg(402 KB)

sw05.jpg(145 KB)

sw06.jpg(3 MB)

sw07.jpg(296 KB)

sw08.jpg(503 KB)

sw09.jpg(272 KB)

sw10.jpg(2 MB)

sw11.jpg(998 KB)

sw12.jpg(115 KB)

sw13.jpg(537 KB)

sw14.jpg(181 KB)

sw15.jpg(179 KB)

sw16.jpg(187 KB)

sw17.jpg(214 KB)

sw18.jpg(510 KB)

sw19.jpg(156 KB)

sw20.jpg(215 KB)

sw21.jpg(99 KB)

sw22.jpg(167 KB)

sw23.jpg(129 KB)

sw24.jpg(224 KB)

sw25.jpg(166 KB)

sw26.jpg(218 KB)

sw27.jpg(277 KB)

sw28.jpg(185 KB)

sw29.jpg(175 KB)

sw30.jpg(162 KB)

sw31.jpg(2 MB)

sw32.jpg(272 KB)

sw33.jpg(361 KB)

sw34.jpg(144 KB)

sw35.jpg(470 KB)

sw36.jpg(465 KB)

sw37.jpg(199 KB)

-----------------------------------

1. ext: jpg

2. ext: jpg

3. ext: jpg

4. 이미지 검사: true

Comments