우주코딩
File 입출력 사용하기 본문
App 아키텍쳐
App -- 저장 --> List (게시글, 회원, 프로젝트, 작업)
List는 메모리이다. (RAM)
파일은 외부저장장치이다 (HDD)
List -- 저장 --> 파일
파일(게시글, 회원, 프로젝트, 작업) -- 로딩 --> List
App을 종료하더라도 Data를 유지할 수 있다.
-------------------------------------------------------
자바 스트리밍 API
-File
-FileInputStream
-FileOutputStream
Date I/O Stream API 주요 클래스
File = 파일, 디렉토리 정보 다루기
FileInputStream = 파일에서 데이터 읽어오는 역할
FileOutputStream = 파일로 데이터를 출력하는 역할
바이너리 파일 vs 텍스트 파일
바이너리 파일 pdf, doc, xls, ppt, gif :
사람이 직접 읽을 수 없다.
전용 App을 사용해야 읽고 쓸 수 있다.
텍스트 파일 java, txt, html, css, js :
사람이 직접 읽을 수 있다.
전용 App 없이 일반 텍스트 에디터로 읽고 쓸 수 있다.
FileOutputStream
write() 메서드로 파라미터로 받은 int값 중에서 맨 하위 1byte만 출력한다.
Streaming API 유래
초기 : 각 디바이스에 따라 데이터 입출력을 위한 함수가 다르다. H/W 제조사에서 제공하는 Device Driver를 이용하여 장비를 제어했다. 이것의 문제점은 개발자는 각 장비별로 드라이버에서 제공하는 데이터 입출력 API 사용법을 학습해야한다.
제조사에서 제공하는 드라이버의 API를 App과 연결하는 Data Steam API를 통하여 개발자에게 장비별로 드라이버 API 사용을 감춘다. Data Stream API는 C언어에서 등장하여 장비와 연결된 파일을 통해 I/O을 수행한다.
장비에 상관없이 그 장비의 데이터를 입출력의 문 역할자(파일)를 생성 -> 장비와 연결 (mount)
파일을 통해 데이터를 읽고 쓸 수 있는 함수를 정의. 장비에 상관없이 일관된 방법으로 데이터를 읽고 쓸 수 있게 되었다. (장비 전용 API 호출 코드를 캡슐화하는 효과)
개발자 입장에서는 장비로 입출력 할 때 파일로 다룬다는 점이 프로그래밍을 편하게 한다. 장비의 유형에 대해 고민할 필요가 없다.
Stream API의 읽기 / 쓰기
read() - byte, byte[]
write() - byte, byte[]
자바의 Stream API는 C언어의 Stream API를 모방하여 만듦. 그래서 read(), write() 메서드 사용법이 유사하다.
데코레이터
기본 기능에 다른 기능을 덧붙이는 역할을 하는 객체
(interface) (객체의 규칙 정의)
component
operation() 객체가 수행해야할 기능을 선언
(concrete)
기본기능
operation() 기능을 구현
(concrete)
데코레이드
operation() {component.operation() + 기능 추가}
*Decorator 설계 방식으로 만들면 기능 확장을 쉽게 할 수 있다.
기능 확장 : 기존 기능에 새 기능을 덧붙이기 쉽고 빼기도 쉽다.
자바의 Stream API 는 decorate 패턴으로 만들어져있다.
FileOutputStream 과 데코레이터
(abstract)
OutputStream (데이터 출력을 담당하는 객체가 반드시 가져야할 기능을 선언)
- write(int)
- write(byte[])
- write(byte[], offset, len)
데이터 출력 일을 하고 객체가 반드시 갖춰야하는 기능을 선언
FileOutputStream
ByteArrayOutputStream
PipedOutputStream
은 기본기능을 제공하는 객체이다
ObjectOutputStream
FilterOutputStream
이 둘은 OutputStream을 상속한다.
ㄴ DataOutputStream
이 클래스 들은 확장 기능을 제공하는 객체이다. 즉, 데코레이터의 역할을 한다.
객체 스스로 기능 수행 불가하다. 오로지 기능을 확장하는 일만 한다.
데코레이터는 int 값을 바이트 단위로 분리하여 출력하는 일을 한다.
실제 출력은 이 데코레이터와 연결된 객체에 위임한다. 데코레이터로 중간에서 기능을 덧붙이는 일만 한다.
객체 직렬과 데코레이터
writeObject() --> ObjectOutputStream
serialize 가 허락된 객체가 들어가면 해당 메서드 안에서 객체의 필드값을 바이트 배열에 담아서 출력
out.write(byte[]);
직렬화와 복원
Serialize 객체
clas Board implements java.io.Serial
객체의 직렬을 허락한다는 의미
'Project' 카테고리의 다른 글
어플리케이션 아키텍쳐의 변환과 DBMS, SQL (0) | 2021.10.11 |
---|---|
Observer 옵저버 패턴 적용하기 (0) | 2021.09.23 |
제네릭 적용 (0) | 2021.08.22 |
유스케이스, 추상클래스, 스택 사용하기 (0) | 2021.08.22 |
Composite 디자인 패턴 적용하기 (0) | 2021.08.03 |