헉 마지막 챕터 14
요거 하고 처음부터 쭉 보면서 복습하기루
ㅇ입출력 스트림 이해, 입출력 스트림 클래스 선택할 줄 알기
ㅇ바이트 기반 입출력 스트림 사용할 수 있기
ㅇ문자 기반 입출력 스트림 사용할 수 있기
[14-1] 입출력스트림 InputStream OutputStream Reader Writer
데이터를 읽고 출력하는데 사용되는 입출력 API 공부
데이터는 출발지에서 도착지로 흘러가고,
자바에서는 스트림을 통해 데이터가 입출력된다.
출발지 : 출력 스트림 사용 (데이터를 출력해야 하므로)
도착지 : 입력 스트림 사용 (흘러온 데이터를 입력받아야 하므로)
입력 스트림
출력 스트림
입출력 스트림 종류
java.io 패키지에서 여러 스트림클래스를 제공 -> 크게 두종류로 구분
ㅇ바이트 기반 스트림 : 그림, 멀티미디어 등 바이너리 데이터를 입출력시
ㅇ문자 기반 스트림 : 문자 데이터를 입출력시
->어떤 기반 스트림인지는 최상위클래스를 보고 구별할 수 있다.
아래 최상위 클래스는 모두 추상 클래스이다.
(추상클래스 복습 : new연산자를 이용해 객체생성할 수 없다.)
모든 바이트/문자 기반 입출력 스트림은 해당 최상위 클래스를 상속받아서 만들어진다. 또한 아래 최상위 클래스에는 입or출력 스트림이 가져야 할 기본적인 메소드가 정의되어있다.
구분 | 바이트 기반 스트림 | 문자 기반 스트림 | ||
입력 스트림 | 출력 스트림 | 입력 스트림 | 출력 스트림 | |
최상위 클래스 | InputStream | OutputStream | Reader | Writer |
하위(자식) 클래스 예시 | XXXInputStream | XXXOutputStream | XXXReader | XXXWriter |
예) 이미지 바이너리 파일의 입출력 스트림 클래스는 FileInputStream, FileOutputStream
예) 텍스트 파일의 입출력 스트림 클래스는 FileReader, FileWriter
<<14-1에서 학습할 것>>
ㅇ바이트 출력 스트림 : OutputStream 클래스
ㄴ메소드 write(int b), write(byte[] b), write(byte[] b, int off, int len)
ㅇ바이트 입력 스트림 : InputStream
ㄴ메소드 read(), read(byte[] b), read(byte[] b, int off, int len)
ㅇ문자 출력 스트림 : Writer
ㄴ메소드 write(int c), write(char[] cbuf), write(char[] cbuf, int off, int len), write(String str), write(String str, int off, int len)
ㅇ문자 입력 스트림 : Reader
ㄴ메소드 read(), read(char[] cbuf), read(char[] cbuf, int off, int len)
여기서는 바이트 입출력 스트림 OutputStream, InputStream을 먼저 공부해보자.
바이트 출력 스트림
OutputStream
리턴 타입 | 메소드 | 설명 |
void | write(int b) | 1byte를 출력 |
void | write(byte[] b) | '매개값 배열 b'의 모든 바이트 출력 |
void | write(byte[] b, int off, int len) | '매개값 배열 b'의 인덱스 b[off]부터 시작해서 len개까지의 바이트 출력 |
void | flush() | 출력 버퍼에 잔류하는 모든 바이트 출력 |
void | close() | 출력 스트림을 닫는다. |
자식 클래스 : FileOutputStream, PrintStream, BufferedOutputStream, DataOutputStream 클래스 등
ㅇwrite(int b) 메소드 /OutputStream
매개 변수로 int가 주어진다. 4byte의 int가 전부 출력스트림으로 보내지는 게 아니다.
끝의 1byte만 출력 스트림으로 보낸다.
복습)
4byte -> 32bit, int로는 2^32개 정수범위 표현 가능. 그 21억 어쩌구.. 그거!! 음수 2^31개, 양수2^31-1개
○예제 : 10, 20, 30이 저장된 각각의 바이트를 C:\Temp\test1.db로 출력해서 test1.db의 내용으로 저장하기
ㅇ데이터도착지를 test1.db로 하는 바이트 기반 출력 스트림 생성 후 OutputStream타입 변수 os에 대입함.
ㅇFileOutputStream은 자식 클래시이므로 자동타입변환이 일어남
18라인이 매우 중요하다고 하는데!!
출력 스트림은 출력할 바이트를 바로 보내지 않는다!! => 그럼 어디에 보내느냐??
우선!! 내부 버퍼(저장소)에 우선 저장을 해놓는다.
flush() 메소드는 이 내부 버퍼에 잔류된 바이트를 모두 출력하는 역할을 한다!!
이런 버퍼의 사용 이유는 14-2에서 설명하겠다고 한다!
19줄 : OutputStream을 더 이상 사용하지 않겠다는 의미. 출력스트림 닫기. close() 메소드!
ㅇwrite(byte[] b) 메소드 /OutputStream
=>매개값으로 주어진 배열의 <모든 바이트>를 출력스트림으로 보낸다.
○예제 : 배열 전체를 출력하기
ㅇwrite(byte[] b, int off, int len) 메소드 /OutputStream
=> b[off]부터 len개의 바이트를 출력 스트림으로 보낸다.
○예제 : 배열 일부를 출력하기
바이트 입력 스트림
InputStream
리턴타입 | 메소드 | 설명 |
int | read() | 1byte를 읽고, 읽은 바이트 리턴 |
int | read(byte[] b) | 읽은 바이트를 매개값 매별에 저장 -> 읽은 바이트 수 리턴 |
int | read(byte[] b, int off, int len) | 해당 배열에서 b[off]부터 len개까지 저장 -> 읽은 바이트 수 리턴 |
void | close() | 입력 스트림 닫기 |
자식 클래스 : FileInputStream, BufferedInputStream, DataInputStream 등
ㅇread()메소드 /InputStream
=>입력 스트림에 들어온 바이트들을 읽는데, 1byte어치만 읽고 int(4byte)타입으로 리턴한다.
(리턴된 4byte 중 끝의 1byte에만 데이터가 들어가 있는 거!)
만약에 입력 스트림에 5개의 바이트가 들어온다면 read()메소드를 통해 1byte씩 5번 읽게 된다. (리턴은 int고 4byte로)
더 이상 입력스트림으로 읽을 수 있는 바이트가 없다면 read() 메소드는 -1을 리턴한다 => 읽을 수 있는 마지막 바이트까지 쫙 읽을 수 있다.
○예제 : C:/Temp/test1.db에 저장한 내용을 1byte씩 끝까지 읽어보자.
ㅇ데이터 출발지를 test1.db로 하는 바이트 기반 파일 입력 스트림을 생성 -> InputStream타입 변수에 대입
ㅇInputStream으로 반복해서 1byte씩 읽고 모니터에 출력한다.
ㅇclose() -> InputStream을 더 이상 사용하지 않겠다.
ㅇread(byte[] b) 메소드 /InputStream
=>매개값으로 주어진 배열의 '길이만큼' 바이트를 읽고 '해당 배열에 저장' + 읽은 바이트 수 리턴
(읽은 바이트 수가 배열길이보다 쪼꼬미면 읽은수맨콤만 리턴)
○예제: 배열 길이만큼 읽기
★read(byte[] b)와 read()
=>많은 양의 바이트를 읽을 때에는 read(byte[] b)가 좋다. 입력스트림으로부터 바이트가 100개 들어오면 read()는 100번을 반복해 읽어야 하는데, read(byte[] b)는 한 번 읽을 때 배열 길이만큼 읽으니까... 훨씬 읽는 횟수가 적다.
ㅇread(byte[] b, int off, int len) /InputStream
이것도 마찬가지다.. 바이트 배열의 b[off]에서부터 len개만큼의 바이트를 저장하는 것임~!
읽은 바이트 수인 len개를 리턴한다.
(len개보다 적게 바이트를 읽게 될 경우.. 읽은 수만큼만 리턴한다.)
갯수 지정해서 다음과 같이 읽고 저장할 수 있다는 말!!
*한 번에 읽어들이는 바이트 수를 len매개값을 통해 조절 가능하다는 거,
*배열에서 저장이 시작되는 인덱스를 지정할 수 있다는 거.
○예제 : 3byte를 읽고, 길이 5인 배열의 2,3,4인덱스에 저장하기
바이트 기반 스트림을 공부했다.
이제 문자 기반 스트림을 공부하자
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 8/16 14-2 [보조 스트림] [문자변환] [성능향상] [기본타입입출력] [프린터] (0) | 2020.08.16 |
---|---|
[혼자 공부하는 자바] 8/14 14-1 [입출력 스트림] [문자 기반 스트림] [문자 입출력 스트림] [Writer] [Reader] (0) | 2020.08.14 |
[혼자 공부하는 자바] 8/13 13-2 [컬렉션프레임워크] [LIFO(후입선출)/Stack클래스] [FIFO(선입선출)/Queue인터페이스] (0) | 2020.08.13 |
[5주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.08.09 |
[혼자 공부하는 자바] 8/9 13-1 [Map 컬렉션] [Map인터페이스] [HashMap] [Hashtable] (0) | 2020.08.09 |