DAY11 - 파일 입출력

은나현·2023년 2월 6일
0

📌 1. 파일 입출력

📍 1-1. java.io.File

  • File 클래스는 파일 또는 폴더에 대한 정보를 제공하는 클래스이다.
  • File 클래스의 객체는 정보를 조회하고자 하는 파일이나 폴더의 경로에 대한 문자열을 생성자 파라미터로 전달하는 형태로 만들 수 있다. ( 이 때 파라미터로 전달되는 경로가 실제로 존재하지 않더라도 File 객체의 생성이 가능하다. )
    • C:\photo\food.jpg 파일에 대한 객체 생성
    	File file = new File("C:/photo/food.jpg");
    	File file = new FIle("C:/photo","food.jpg");
    • 운영체제간의 호환성 유지
      • 경로 문자열을 설정할 때 윈도우기반에서는 역슬래시(\)를 사용하지만 이 경우 이스케이프 문자를 사용하여 \\의 형식으로 사용해야 한다.
      • 가급적 다른 운영체제와의 호환성을 위해 슬래시(/)를 사용하는 것이 좋다.

📍 1-2. 절대경로와 상대경로

  • 절대경로
    • 작업 디렉토리와 관계없이 절대적인 위치를 의미하는 경로
      • 윈도우 예시 : C:/Windows/System32/drivers/etc/hosts
      • 리눅스 예시 : /etc/httpd/conf/httpd.conf
  • 상대경로
    • 작업 디렉토리를 기준으로 상대적인 위치를 의미하는 경로
      • 윈도우 예시 : ../drivers/etc/hosts
      • 리눅스 예시 : ./conf/httpd.conf

📍 1-3. File 메소드

  • isFile()

    • 전달된 경로가 파일인지 검사한다.
      존재하지 않는 파일로 검사할 경우 무조건 false
  • isDirectory()

    • 전달된 경로가 디렉토리인지 검사한다.
      존재하지 않는 디렉토리로 검사할 경우 무조건 false
  • isHidden()

    • 전달된 경로가 숨김 형태인지 검사한다.
      존재하지 않는 파일로 검사할 경우 무조건 false
  • getAbsolutePath()

    • 절대경로 값을 추출한다.
      ex) C:\gb_enh\java\workspace\day11\src\file\Main01.java
  • exists()

    • 전달된 경로가 물리적으로 존재하는지 검사한다.
      존재하지 않는 파일로 검사할 경우 무조건 false
  • mkdirs()

    • 전달된 경로에 따른 디렉토리를 생성한다.
      ex) File f1 = new File("a/b/c/target");
  • getName()

    • 마지막 / 이후 단어를 리턴한다.
      ex) f1.getName() -> target 리턴
  • getParent()

    • 처음부터 마지막 / 직전까지 리턴한다.
      ex) f1.getParent() -> a\b\c 리턴

📍 1-4. 인코딩과 스트림

  • 문자 인코딩 ( Character Encoding )

    • 문자나 기호들의 집합을 컴퓨터에서 저장하거나 통신에 사용할 목적으로 부호화하는 방법
      * UTF-8 : 8비트 이진수로 표현하는 방법
  • 스트림 ( Stream )

    • 입출력에서 stream이란 디바이스의 입출력 방식이 character 단위이든 block 단위이든 관계없이 1바이트씩 연속적으로 전달되는 형태로, 추상화된 상태를 의미한다.
    • 입출력 장치는 개별적인 특성이 있으므로 읽고 쓰는 단위가 각각 다르지만 스트림은 이러한 일련의 과정을 추상화하여 모든 디바이스를 character 단위로만 사용하도록 한다.
    • 즉, 입출력 디바이스의 특성을 무시하고 하나의 단일한 입출력 인터페이스로 다룰 수 있도록 하는 것이 stream이다.
    • 스트림 관련 클래스들은 각각 InputStream(입력/읽기), OutputStream(출력/저장)과 관련된 인터페이스를 상속받기 때문에 모두 동일한 메서드를 가지고 있다.

📌 2. 파일 입출력 양식

📍 2-1. 파일 쓰기

  • 파일을 쓸 때는 변수 선언 -> 출력할 내용 변환 -> 파일 쓰기의 순서로 출력한다.
  • 사용할 변수 선언
    • 출력할 파일의 경로와 이름을 final로 저장하고, 출력할 내용을 지정한다.
      이것을 byte배열로 변환한 내용이 담길 변수는 byte[]로 선언한다.
    	// 저장할 파일의 경로
    	final String PATH = "./test.txt";
    	// 파일에 저장할 내용
    	String write_string = "가나다라마바사abcdefg";
    	byte[] buffer = null;
  • 출력할 내용 byte로 변환

    • 문자열을 파일로 저장하기 위해서는 byte 배열로 변환해야 한다. 문자열을 byte배열로 변환하기 위해서 getBytes() 메서드를 사용하는데, 이 때 변환 과정에서 사용될 인코딩 형식을 지정해 주어야 한다.
    		try {
    			buffer = write_string.getBytes("utf-8");
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
                // getBytes()메서드는 존재하지 않는 인코딩 형식에 대한 지정을 방지하기 위하여
                // 예외처리를 강제적으로 요구한다.
    		}
  • 파일 출력

    • 	// finally 블록에서 out을 닫아 주기 위해 외부에 선언한다.
      		OutputStream out = null;
      		try {
      			out = new FileOutputStream(PATH);
      			// 파일 쓰기
      			out.write(buffer);
            		//buffer에 담긴 byte배열을 출력한다.
      			System.out.println("[INFO] 파일 저장 성공 >> " + PATH);
      		} catch (FileNotFoundException e) {
      			System.out.println("[ERROR] 지정된 경로를 찾을 수 없음" + PATH);
      			e.printStackTrace();
      		} catch (IOException e) {
      			System.out.println("[ERROR] 파일 저장 실패 >> " + PATH);
      			e.printStackTrace();
      		} catch (Exception e){
      			System.out.println("[ERROR] 알 수 없는 에러 >> " + PATH);
      			e.printStackTrace();
      		} finally {
      			try {
      				out.close();
      			} catch (IOException e) {
      				e.printStackTrace();
      			} 
      		}

📍 2-2. 파일 읽기

  • 파일을 읽을 때는 변수 선언 -> 파일 읽어오기 -> 변환하여 출력의 순서로 읽어온다.
  • 사용할 변수 선언
    • 읽어올 파일의 경로와 이름을 final로 저장한다. 읽어온 내용이 담겨질 변수는 byte[], 변환한 내용이 담길 변수는 String으로 생성한다.
    		// 읽을 파일 경로
    		final String PATH = "./test.txt";
    		// 읽은 내용이 담겨질 스트림
    		byte[] data = null;
    		// 읽은 내용이 변환될 문자열
    		String read_string = null;
  • 파일 읽기
    • 읽기 도중 byte[]avaliable()을 이용한 사이즈 할당이 이루어진다. 할당 후 read() 메소드에 이 배열을 파라미터로 전달한다.
    		// finally 블록에서 in을 닫아 주기 위해 외부에 선언한다.
            InputStream in = null;
    		try {
    			in = new FileInputStream(PATH);
    			// 읽은 내용을 담기 위한 배열은 파일의 용량만큼 사이즈를 할당한다.
    			// in.available() -> 열고 있는 파일의 크기
    			data = new byte[in.available()];
    			// 파일 읽기 - 파라미터로 전달된 배열 안에, 파일의 내용을 담아준다.
    			in.read(data);
    			System.out.println("[INFO] 파일 읽기 성공 >>" + PATH);
    		} catch (FileNotFoundException e) {
    			System.out.println("[ERROR] 지정된 경로를 찾을 수 없습니다. >>" + PATH);
    			e.printStackTrace();
    		} catch (IOException e) {
    			System.out.println("[ERROR] 파일 읽기 실패 >>" + PATH);
    			e.printStackTrace();
    		} catch (Exception e) {
    			System.out.println("[ERROR] 알 수 없는 에러 >>" + PATH);
    			e.printStackTrace();
    		} finally {
    			try {
    				in.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
  • 읽어온 내용을 문자열로 변환
    		// data에 읽어온 내용이 담겨 있으면 문자열로 변환하여 출력하는 조건문
           if( data != null ) {
    				try {
    					// 문자열을 변환 시에는 저장된 인코딩으로 지정
    					read_string = new String(data, "utf-8");
    					System.out.println(read_string);
    				} catch (UnsupportedEncodingException e) {
    					System.out.println("[ERROR] 인코딩 지정 에러");
    					e.printStackTrace();
    				}			
    			}

0개의 댓글