009. 파일 입출력

Cornchip·2022년 9월 27일
0

bitcamp

목록 보기
9/11
post-thumbnail

목차
1. 파일 입출력 패키지
2. 데이터 저장 형식



1. 파일 입출력 패키지

1) base

  • 파일 입출력 : binary 저장/읽기

    • 생성자에 파일 이름을 받는 파라미터 추가
  • 바이너리(binary) 데이터 입출력

    바이너리 : byte형식의 데이터

  • 데이터 저장

    • 객체(인스턴스) >> 필드에 저장된 값을 바이트 배열로 전환 >> 순차적으로 저장 >> 파일

      순차적으로 저장하는것을 도와주는 class : FileOutputStream

  • 데이터 읽기

    • 파일 >> 순차적으로 읽기 >> 바이트 배열의 값을 필드에 저장 >> 객체(인스턴스)

      순차적으로 읽는것을 도와주는 class: FileInputStream


2) FileOutputStream / FileInputStream

  • FileOutputStream

    • write() : 1byte 출력
    • write(byte[]) : byte 배열 출력
  • FileInputStream

    • read() : 1byte 읽기
    • read(byte[]) : byte 배열 읽기
  • 파일 입출력 시, 파일이 존재하지 않을 수 있다.

    FileNotFoundException
    = Checked Exception
    = 반드시 명시적으로 체크해주어야 하는 예외


3) 자바 I/O Stream : java.io.*

  • InputStream/OutputStream : byte stream(byte, byte[])
  • Reader/Writer : character stream(char, char[])
  • DataSinkStream : 데이터 저장소에 직접 읽기/쓰기를 수행하는 클래스

    data 저장소
    파일 / 메모리 / 프로세스의 3 종류로 나뉜다.

  • DataProcessingStream : 중간에서 데이터를 가공하는 일을 하는 클래스

    중간에서 데이터를 가공하는 일을 하는 클래스 : decorator


4) 버퍼

  1. 버퍼를 사용하는 이유
  • HDD로 출력하는데는 시간이 많이 소요되기 때문이다.

    1 byte씩 바로 바로 HDD로 출력하는 것보다 일정량의 바이트들을 메모리에 모았다가 한 번에 출력하는 것이 시간이 덜 소요된다.


  1. 객체 직렬화

    인스턴스를 통째로 입출력하기
    = 인스턴스 필드의 값을 통째로 입출력하기

  • Serialize(직렬화)Deserialize(역직렬화)
    1) serialize

    = 직렬화
    = marshaling

  • 바이트 배열로 변환
  • 바이트 배열
    • 클래스정보(이름, 패키지명 등)
    • 버전 번호(serialVersionUID)
    • 필드 값

2) deserialize

= 역직렬화
= unmarshaling

  • 바이트 배열에 있는 data로 인스턴스 생성
  • 바이트 배열
    • 클래스정보
    • 버전 번호
    • 필드 값

직접 필드값을 출력하는 것보다 파일 크기가 더 커지는 단점이 있다.
장점 : 코딩이 쉽다.
단점 : 다른 프로그래밍 언어로 읽고 쓰기가 어렵다.



2. 데이터 저장 형식

1) CSV형식

  • Comma Separated Values

  • 클래스

    • FileReader, FileWriter
    • CSV 방식으로 입출력
  • 텍스트 형식의 데이터 특징

    • 바이너리 형식보다 파일 크기가 크다.

    • 저장할 때 UTF-16 => UTF-8로 인코딩
      읽을 때 UTF-8 => UTF-16로 디코딩

    • 인코딩/디코딩에 시간소요

    • 텍스트 편집기로 직접 변경 가능

      바이너리 형식은 전용 App을 사용해야 한다.

    • 프로그래밍 언어 간 호환이 잘 된다.

      App끼리 데이터 교환이 쉽다.

  • FileReader 클래스의 readLine() : 한 줄 단위로 문자열을 끊어서 리턴

  • CSV의 한계와 대안 형식

    • CSV : 다른 데이터를 포함하고 있는 데이터를 표현하기 힘들다.
      즉, 계층 구조로된 데이터를 표현하기 어렵다.

계층 구조의 데이터를 표현할 수 있고, 텍스트 형식으로 되어 있어,
OS나 프로그래밍 언어에 종속되지 않는 공개된 데이터 포맷 :
XML과 JSON 형식


2) XML형식

  • eXtensible Markup Language

  • 계층적인 구조의 데이터 표현이 가능하다.

    • 각 데이터의 의미를 표시
      = 데이터 조회 및 추출이 용이하다.
      = App에서 데이터를 제어하기가 쉽다.
      = 인간이 아닌 프로그램에서 데이터를 다루기 쉽다.
  • 텍스트 형식이다.

    • OS나 프로그래밍 언어에 상관없이 데이터를 주고 받기 쉽다.

      프로그램끼리 데이터 교환이 용이하다.

  • XML의 단점

    데이터보다 부가데이터가 더 클 수 있다.
    = 파일크기가 매우 커진다.


3) JSON 형식

  • JavaScript Object Notation :

    자바스크립트에서 객체를 표현하는 문법을 차용하여 데이터를 표현하는 문법으로 만든 것.

  • 중괄호로 시작한다.
  • 배열일 경우 대괄호로 시작한다.
  • tag명을 반드시 double quotation 으로 한다.
{
    "title":"---",
    "descriptoin":"---",
    "authors":[{"name":"---","email":"---","tel":"---"}, 
                {"name":"---","email":"---","tel":"---"}],
    "press":{"name":"---",
            "homepage":"---",
            "tel":"---"}
}
  • 계통형 데이터 표현이 쉽다.
  • 프로퍼티 명을 통해 데이터 의미를 표시한다.
    = XML의 태그명 (XML보다 부가 데이터의 크기가 작다)
  • 텍스트 형식이다.
    = XML보다 간결하다.
  • JSON형식으로의 파일입출력 과정

    • serialize (=encoding)

      [객체] >> toJson() >> [Gson] >> 생성 >> [JSON 문자열]

    • deserialize (=decoding)

      [객체] << fromJson() << [Gson] << 로딩 << [JSON 문자열]

profile
cornchip

0개의 댓글