본문 바로가기
JAVA

JAVA(fileIO, JSONObject)

by 글로리. 2020. 6. 16.

java.io.File

  • File 클래스는 파일 또는 폴더에 대한 정보를 제공하는 클래스.
  • 파이썬에서 os 클래스와 비슷하다고 보면됨.
  • File 클래스의 객체는 정보를 조회하고자 하는 파일이나 폴더의 경로에 대한 문자열을 생성자 파라미터로 전달하는 형태로 만들 수 있음.
  • 이 때 파라미터로 전달되는 경로가 실제로 존재하지 않더라도 File 객체의 생성이 가능함.

경로 설정하기

  • 운영체제간의 호환성 유지를 위한 '/' 의 사용
    • 경로 설정시 윈도우에서는 역슬래시()를 사용하지만 이 경우 '\'의 형식으로 사용해야하고, 가급적 다른 운영체제와의 호환성을 위해 '/' 를 사용하는것이 좋음.
  • 절대 경로
    • 작업 디렉토리와 관계없이 절대적인 위치를 의미하는 경로
    • 리눅스 예시 : /etc/httpd/conf/httpd.conf
    • 윈도우 예시 : C:/Windows/System32/driver/etc/hosts
  • 상대 경로
    • 작업 디렉토리와 관계없이 절대적인 위치를 의미하는 경로
    • 리눅스 예시 : ./conf/httd.conf
    • 윈도우 예시 : ../drivers/etc/hosts
import java.io.File;

public class Main01 {
    public static void main(String[] args) {
        // 절대경로나 상대경로를 생성자 파라미터로 전달한다.
        // 이클립스에서 상대경로를 사용할 경우, 현재 프로젝트가 
        // 기준이 된다.
        File f1 = new File("src/Main01.java");

        // isFile - 전달된 경로가 파일인지 검사
        // --> 존재하지 않는 파일로 검사할 경우 무조건 false
        boolean is_file = f1.isFile();

        // isDirectory - 전달된 경로가 디렉토리(폴더)인지 검사
        // --> 존재하지 않는 디렉토리(폴더)로 검사할 경우 무조건 false
        boolean is_dir = f1.isDirectory();

        // isHidden - 전달된 경로가 숨김형태인지 검사
        // --> 존재하지 않는 파일,디렉토리로 검사할 경우 무조건 false
        boolean is_hidden = f1.isHidden();

        // getAbsolutePath - 절대경로 값을 추출
        String abs = f1.getAbsolutePath();

        // exists - 생성자에 전달된 파일이나 디렉토리가 물리적으로 존재하는지를 검사
        boolean is_exist = f1.exists();

        // 디렉토리 정보 객체 생성
        File f2 = new File("a/b/c/target");
        System.out.println("isFile: " + f2.isFile());
        System.out.println("isDirectory: " + f2.isDirectory());
        System.out.println("isHidden: " + f2.isHidden());
        System.out.println("절대경로: " + f2.getAbsolutePath());
        System.out.println("존재여부: " + f2.exists());

        // 경로에 따른 디렉토리 생성
        // mkdir - 최종폴더만 생성
        // mkdirs - 중간경로에 없는 폴더도 같이 생성.
        f2.mkdirs();

        // File f1 = new File("src/Main01.java")
        // File f2 = new File("a/b/c/target")
        // 마지막 "/" 이후 단어를 리턴 -> 파일(폴더)명 추출
        System.out.println(f1.getName());    // Main01.java
        System.out.println(f2.getName());    // target  

        // 처음부터 마지막 "/" 직전까지 리턴
        System.out.println(f1.getParent());  // src
        System.out.println(f2.getParent());  // a/b/c

        // 삭제 시도 --> 성공시 true, 실패시 false
        boolean del_ok = f2.delete();
    }
}

IuputStream / OutputStream

문자 인코딩(character encoding)

  • 문자나 기호들의 집합을 컴퓨터에서 저장하거나 통신의 목적으로 부호화 하는방법
    • 모스부호 : 전건을 길게, 또는 짧게 두드려서 라틴 알파벳을 표현.
    • 아스키(ASCII) : 라틴 알파벳, 숫자, 특수문자 등을 정수와 그에 대응하는 7비트 이진수로 표현.
    • UTF-8 : 8비트 이진수로 표현하는 방법.

스트림(Stream)

  • 입출력에서 stream이란 디바이스의 입출력 방식이 1바이트연속적으로 전달되는 형태로, 추상화된 상태를 의미
  • 입출력 장치(키보드, 모니터, 프린트 등)는 개별적인 특성이 있어 읽고 쓰는 단위가 각각다르지만 스트림은 이러한 일련의 과정을 추상화하여 모든 디바이스를 character 단위로만 사용하도록 함.
  • 즉, 입출력 디바이스의 특성을 무시하고 하나의 단일한 입출력 인터페이스로 다룰수 있도록 하는것이 스트림(stream) 이다.

파일 저장 과정

  1. 저장을 위한 빈파일 생성
    • OutputStream의 객체 생성
  2. 파일에 내용 쓰기
    • 저장할 내용을 byte 배열로 변환
    • 변환된 배열을 OutputStream의 write()메서드에게 파라미터로 전달.
  3. 파일 닫기
    • OutputStream 객체로 close()메서드를 호출하여 스트림을 닫는다.
    • 파이썬과 달리 자동으로 파일을 닫아주지 않아 입력해야 함.
    • 입력하지 않으면 컴퓨터에서 계속 작업중인 상태로 띄워져 삭제 불가능.

파일 저장시 유의사항

  • OutputStream은 각각 단계하다 예외처리를 강제적으로 요구함.
  • try ~ catch 블록이 형성되는 과정에서 변수의 유효성 범위에 대한 처리에 유의

파일 저장하기

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

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

        // 저장할 파일의 경로
        final String PATH = "./test.txt";

        // 파일에 저장할 내용
        String write_string = "가나다라마바사nabcd";

        /** 특정 인코딩 방식 적용 */
        // 다른블록에서도 buffer을 인식하기 위해서 블록 밖에서 선언.
        // 할당되지 않은 빈 영역임을 표시하기 위해 null로 초기화
        byte[] buffer = null;
        try {
            buffer = write_string.getBytes("utf-8");
        }
        // 인코딩 형식을 지원하지 않을 수 있는것과 오타 방지를 위해 예외처리
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        /** 파일 저장 절차 시작 */
        // finally 블록에서도 out을 인식하기 위해서 블록 밖에서 선언.
        // 할당되지 않은 빈 영역임을 표시하기 위해 null로 초기화
        OutputStream out = null; 
        try {
            out = new FileOutputStream(PATH);
            // 파일쓰기
            out.write(buffer);
            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 {
            if(out!=null) {
                try {
                    out.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

파일 읽기 과정

  1. 파일을 읽기 위한 InputStream 객체 생성
  2. 읽은 내용을 담기위한 빈 byte 배열 생성
    • 파일의 용량 크기 만큼 배열의 사이즈 지정
  3. 파일의 내용 읽기
    • 읽은 내용을 담기위한 byte 배열을 InputStream 객체의 read() 메서드를 호출하여 스트림을 닫는다.
  4. 스트림 닫기
    • InputStream 객체의 close() 메서드를 호출하여 스트림을 닫는다.
  5. 읽은 내용을 문자열로 변환
    • byte 배열을 String 클래스의 생성자에게 전달하여 문자열로 변환
    • 이 과정에서 어떤 인코딩을 사용할지 함께 설정해야함.
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

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

        // 읽을 파일의 경로
        final String PATH = "./test.txt";

        // 읽은 내용이 담겨질 스트림
        byte[] data = null;

        // 읽은 내용이 변환될 문자열
        String read_string = null;

        /** 파일 읽기 */
        InputStream in = null;
        try {
            in = new FileInputStream(PATH);

            // 읽은 내용을 담기 위한 배열은 파일의 용량만큼 사이즈를 할당한다.
            // in.abailable() --> 열고있는 파일의 크기
            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 {
            if (in != null) {
                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();
            }
        }    
    }
}

JSON(Javascript Object Notation)

  • JSON은 경량의 데이터교환형식으로 원래는 Javascript에서 객체 지향을 구현하기 위하혀 사용되는 문법적 표현

JSON 표기법의 중요성

  • JSON은 특정 프로그래밍 언어에 종속되지 않고 언어로부터 독립적으로 존재가능, 여러개의 데이터를 구조적으로 표현할 수 있는 가장 간결한 표현법.
  • JAVA 언어에서는 프로그램 외부에 저장된 파일의 내용을 JSON형식으로 구성하거나 통신을 통해 수신하는 데이터를 JSON으로 처리하여 외부로부터의 데이터 읽기에 활용.
  • 최근 웹, 모바일 등을 중심으로 서로 다른 플랫폼간의 데이터 교환을 위해 활용됨.

'JAVA' 카테고리의 다른 글

JAVA(DAO패턴)  (0) 2020.06.24
JAVA(MySQL연동, JDBC)  (0) 2020.06.23
JAVA(예외처리, 날짜처리, 컬렉션)  (0) 2020.06.15
JAVA (Static, 익명클래스)  (0) 2020.06.11
JAVA(추상화, 인터페이스)  (0) 2020.06.10

댓글