yeny_lab

[혼자 공부하는 자바] 8/13 14-1 [입출력 스트림] [바이트 기반 스트림] [바이트 입출력 스트림] [InputStream] [OutputStream]

2020. 8. 13. 23:03·JAVA
728x90

헉 마지막 챕터 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

=>매개값으로 주어진 배열의 '길이만큼' 바이트를 읽고 '해당 배열에 저장' + 읽은 바이트 수 리턴

(읽은 바이트 수가 배열길이보다 쪼꼬미면 읽은수맨콤만 리턴)

내용: 혼공자 600페이지

 

○예제: 배열 길이만큼 읽기

 

 

★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인덱스에 저장하기


바이트 기반 스트림을 공부했다.

이제 문자 기반 스트림을 공부하자

728x90

'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
'JAVA' 카테고리의 다른 글
  • [혼자 공부하는 자바] 8/16 14-2 [보조 스트림] [문자변환] [성능향상] [기본타입입출력] [프린터]
  • [혼자 공부하는 자바] 8/14 14-1 [입출력 스트림] [문자 기반 스트림] [문자 입출력 스트림] [Writer] [Reader]
  • [혼자 공부하는 자바] 8/13 13-2 [컬렉션프레임워크] [LIFO(후입선출)/Stack클래스] [FIFO(선입선출)/Queue인터페이스]
  • [5주차] 기본미션 + 선택미션 [혼공단] [혼공자]
히어로맛쿠키
히어로맛쿠키
  • 히어로맛쿠키
    yeny_lab
    히어로맛쿠키
  • 전체
    오늘
    어제
    • 분류 전체보기 (389)
      • 미분류글 (32)
        • ㅇ (2)
      • JAVA (84)
        • Effective Java (1)
        • Application (21)
      • 컴퓨터구조 & OS (28)
      • 자료구조 + 알고리즘 (43)
      • Database (12)
      • 컴파일러 (10)
      • 수학 (33)
        • 미분방정식 (12)
      • 데이터분석과 머신러닝 (38)
      • 기타 (59)
      • yyeeennyy (25)
  • 공지사항

    • ^o^/♡
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
히어로맛쿠키
[혼자 공부하는 자바] 8/13 14-1 [입출력 스트림] [바이트 기반 스트림] [바이트 입출력 스트림] [InputStream] [OutputStream]
상단으로

티스토리툴바