| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 프레임워크
- 자바프로그래밍
- SpringMVC
- 오라클
- 메이븐
- PWA
- 생활코딩
- framework
- 자바스크립트
- maven
- 서브쿼리
- javaprogramming
- Oracle
- javascript
- mybatis
- sql
- JavaScript 내장객체
- TodayILearned
- springaop
- 국비지원
- HTML
- CSS
- 스프링
- web
- tdd
- sqldeveloper
- TIL
- 프로그레시브웹앱
- js
- progressive web app
- Today
- Total
1cm
자바 프로그래밍_Day_18_입출력(IO) 본문

2021.09.09
> FileInputStream
-> 파일로부터 바이트 단위를 읽을 때 사용하며, 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일 읽기가 가능하다.
-> InputStream의 하위 클래스로 InputStream과 사용 방법이 동일하다.
-> 객체 생성
-> FileInputStream객체가 생성될 때 파일과 직접 연결 된다. 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리가 필수다.

> FileOutputStream
-> 파일로부터 바이트 단위로 저장할 때 사용하며, 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 데이터를 파일로 저장한다.
-> OutputStream의 하위 클래스로 OutputStream과 사용 방법이 동일하다.
-> 객체 생성
-> FileOutputStream객체가 생성될 때 파일과 직접 연결 된다. 만약 파일이 존재하지 않으면 자동으로 생성하지만, 이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있다.

-> 만약 기존 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체 생성 시 가능하다.

> FileReader
-> 텍스트 파일로부터 문자 단위로 읽을 때 사용한다.(문자 기반의 입력 스트림)
-> 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽기가 불가능하다.
-> Reader의 하위 클래스로 Reader와 사용 방법이 동일하다.
-> 객체 생성
-> FileReader 객체가 생성될 때 파일과 직접 연결된다. 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리는 필수이다.

> FileWriter
-> 텍스트 파일로부터 문자 단위로 저장할 때 사용한다. (문자 기반의 출력 스트림)
-> 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 저장이 불가능하다.
-> Writer의 하위 클래스로 Writer와 사용 방법이 동일하다.
-> 객체 생성
-> FileWriter 객체가 생성될 때 파일과 직접 연결된다. 만약 파일이 존재하지 않으면 자동으로 생성하지만, 이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있다.

-> 만약 기존 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체 생성 시 가능하다.

> 보조 스트림
-> 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용한다.
-> 보조 스트림은 실제 데이터를 주고 받는 스트림이 아니기 때문에 입출력 처리가 불가능 하기 때문에 기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림을 생성해줘야 한다. (기반 스트림이 있어야 보조 스트림 생성 가능)

> 보조 스트림 종류
-> 문자 변환(InputStreamReader / OutputStreamWriter)
-> 입출력 성능(BufferedInputStream / BufferedOutputStream)
-> 기본 데이터 타입 출력(DataInputStream / DataOutputStream)
-> 객체 입출력(ObjectInputStream / ObjectOutputStream) 등의 기능을 제공하는 보조 스트림이 있다.

> 문자 변환 보조 스트림
-> 소스 스트림이 바이트 기반 스트림이지만 데이터가 문자일 경우 사용한다.
-> Reader와 Writer는 문자 단위로 입출력을 하기 때문에 데이터가 문자인 경우 바이트 기반 스트림보다 편리하게 사용이 가능하다. (변환해서 사용하겠다는 뜻)
-> InputStreamReader

-> OutputStreamReader

> 성능 향상 보조 스트림 (Buffered InputStream/Reader | OutputStream/Writer)
-> 느린 속도로 인해 입출력 성능에 영향을 미치는 입출력 소스를 이용하는 경우 사용한다.
-> 입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 모아 한꺼번에 작업을 하여 실행 성능이 향상된다.(입출력 회수 줄임)
-> 필터 클래스 중 버퍼(Queue 구조로 되어있는 임시 저장소)를 제공하는 클래스, 프로그램하고 실제로 입출력하게 되는 소스들을 메모리 버퍼를 통해 미리 읽어놓고, 한번에 입출력하게 된다. 출력하게 될 시 버퍼가 다 차지 않는 경우도 있기 때문에 flush()메소드를 호출해 수동으로 잔류 데이터들을 내보내 줄 수 있게 끔 해주기도 한다.
> 기본 타입 입출력 보조 스트림
-> 기본 자료형 별 데이터 읽고 쓰기가 가능하도록 기능을 제공해준다. 단, 입력된 자료형의 순서와 출력될 자료형의 순서가 일치해야 한다. (자료형마다 저장되는 크기가 다르기 때문)

| DataInputStream | DataOutputStream | ||
| 리턴 타입 | 메소드 | 리턴 타입 | 메소드 |
| boolean | readBoolean() | void | writeBoolean(Boolean v) |
| byte | readByte() | void | writeByte(int v) |
| char | readChar() | void | writeChar(int v) |
| couble | readDouble() | void | writeDouble(double v) |
| float | readFloat() | void | writeFloat(float v) |
| int | readInt() | void | writeInt(int v) |
| long | readLong() | void | writeLong(long v) |
| short | readShort() | void | writeShort(short v) |
| String | readUTF() | void | writeUTF(String str) |
> 객체 입출력 보조 스트림
-> 객체를 파일 또는 네트워크로 입출력 할 수 있는 기능을 제공해준다. 단, 객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경해주는 직렬화가 필수이다.

> 직렬화와 역직렬화
-> 직렬화
-> Serializable 인터페이스를 implements하여 구현한다.
-> 객체 직렬화 시 private 필드를 포함한 모든 필드를 바이트로 변환하지만 transient 키워드를 사용한 필드는 직렬화에서 제외한다.
-> 객체를 출력하기 위해서 필드의 값들을 일렬로 늘어선 연속적인 바이트형태로 변경해주는 방식
-> 역직렬화
-> 직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스를 사용한다. 단, 클래스 이름이 같더라도 클래스 내용이 변경된 경우 역직렬화에 실패한다.
-> 파일에 저장되있거나 네트워크로 전송된 데이터들을 객체 형태로 변환해 메모리에 객체 형태로 넣어주는 작업
-> serialVersionUID 필드
-> 직렬화한 클래스와 같은 클래스임을 알려주는 식별자 역할로 컴파일 시 JVM이 자동으로 serialVersionUID 정적 필드를 추가해줘서 별도로 작성하지 않아도 오류는 나지 않지만 자동 생성 시 역직렬화에서 예상하지 못한 InvalidClassException을 유발할 수 있기 때문에 명시를 권장한다. (컴파일 될 때마다 다른 값이 들어갈 수 있음)

> 입출력(IO) 코드 실습과 출력 결과
> chap2.FileByteStream



-> a_byte.dat 파일이 생성되고, 그 안에 fileSave에서 작성했던 코드들이 출력되는 것을 확인할 수 있었다.
> chap2.Application

> chap2.FileCharStream

> chap2.Application



-> b_char파일 생성 -> 데이터 입력확인
> chap3.A_BufferedStream


> chap3.A_BufferedStream.Application

> chap3.B_ByteToCharStream


> chap3.Application

> chap3.C_DataStream

> d_data

> chap3.Member



> chap3.D_ObjectStream


> chap3.Application

> e_object

'국비지원_Java > Java Programming_1' 카테고리의 다른 글
| 자바 프로그래밍_Day_20_제네릭스(Generics) (0) | 2021.09.21 |
|---|---|
| 자바 프로그래밍_Day_19_컬렉션(Collection) (0) | 2021.09.21 |
| 자바 프로그래밍_Day_17_예외처리(Exception) (0) | 2021.09.19 |
| 자바 프로그래밍_Day_16_기본API (0) | 2021.09.15 |
| 자바 프로그래밍_Day_15_다형성(Polymorphism) (0) | 2021.09.14 |