본문 바로가기

언어/Java

입출력 스트림(Stream)

Target은 출력될 목적지

데이터는 키보드를 통해 입력될 수도 있고, 파일 또는 프로그램으로부터 입력될 수 있다. 반대로 데이터는 모니터로 출력될 수도 있고, 파일에 저장되거나 다른 프로그램으로 전송할 수 있다. 이것을 총칭해서 데이터 입출력이라고 한다.

 

※ 입출력 단위 : 스트림(Stream, 물줄기)

 순차데이터흐름, 단방향 흐름

프로그램을 기준으로 데이터가 들어오면 입력스트림

데이터가 나가면 출력 스트림

프로그램이 다른 프로그램과 데이터를 교환하려면 양쪽 모두 입력 스트림과 출력 스트림이 필요

  입력스트림용 API 출력스트림용 API → 4개 다 추상스트림. new 키워드 가질 수 없다
byte 단위 java.io.InputStream java.io.OutputStream  1byte씩
char 단위 java.io.Reader java.io.Writer  1문자씩

Resource

- 키보드에서 ABC를 순서대로 입력하면 CBA가 들어가고 65 66 67 순으로 읽음
가나다를 순서대로 입력하면 다나가가 6바이트로 들어가고 가를 구성하는 2byte의 절반만 읽어옴

'가'라는 문자 정확한 int 타입의 값 반환하지 못하고, 깨진 글자값의 int 타입 반환

- 파일 읽기는 2개의 선택지

파일 a.txt ABC가 저장되어있다. 파일 inputStream을 이용해서 읽으면 65 66 67
a.txt에 가나다가 저장되어있다. 이럴때는 FileReader를 이용해서 읽으면 됨. 얘만 문자 단위 읽기 지원

- 네트워크는 byte단위 스트림이 기본. 문자단위를 읽으려면 가공해야함. getReader이런거 없다.

 

int r = is.read(); → 입력한 값 1바이트씩 읽음

int i = fis.read(); 파일의 내용을 한 바이트씩 읽기  // 1byte읽어서 int타입으로 자동 형변환 ex) 동영상, 이미지 파일 

int i = fr.read(); 파일의 내용을 한 문자씩 읽기 // 1char읽어서 int타입으로 자동 형변환

 형태만 같을 뿐 오버라이드된 메소드들 아님

 

※ FilterStream은 NodeStream 만 갖고 쓰기에 불편해서 FilterStream으로 가공해서 사용

Byte단위스트림 → Char단위스트림
InputStreamReader isr = new InputStreamReader(is);//byte단위의 스트림 문자 단위로 변환, 가공해서 사용
int i = isr.read();

 

※ 데이터타입별로 읽기 제공

 바이트 스트림에 DataInputStream과 DataOutputStream 보조 스트림을 연결하면 기본 타입인

boolean, char, short, int, long, float, double 값을 입출력할 수 있다.

DataInputStream dis = new DataInputStream(is);
int i = dis.readInt();
float f = dis.readFloat();
boolean f = dis.readBoolean();

OutputStream os = s.getOutputstream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(1); //4
dos.wirteFloat(2.3F);//4
dos.wirtedBoolean(true);//1

쓰여진 순서대로 읽기 가능

이 메소드를 사용해 입출력할 때 데이터 타입의 크기가 모두 다르므로  DataInputStream으로 출력한 데이터를

다시 DataOutputStream으로 읽어 올 때는 출력한 순서와 동일한 순서로 읽어야 한다.

예를 들어 출력할 때의 순서가 int → Boolean→ double 이라면 읽을 때의 순서도 int → Boolean→ double이어야 한다.

 

※ 바이트 스트림 : 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 입출력할 때 사용

문자 스트림 : 문자만 입출력할 때 사용.

구분 바이트 스트림 문자 스트림
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스
(예)
XXXInputStream
(FileInputStream)
XXXOutputStream
(FileOutputStream)
XXXReader
(FileReader)
XXXWriter
(FileWriter)

InputStream은 바이트 입력 스트림의 최상위 클래스로, 추상 클래스이다.

우리는 FileInputStream, DataInputStream만함

 

한줄단위로 읽기 제공
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();

 

java.util.Scanner sc = new Scanner(is);
sc.nextInt();
sc.nextFloat();
sc.nextLine();

'언어 > Java' 카테고리의 다른 글

입출력 스트림 예시  (0) 2023.08.09
프린트 스트림, System.in 예시  (0) 2023.08.09
어노테이션(Annotation)  (0) 2023.08.08
날짜와 시간 클래스  (0) 2023.08.08
포장 클래스(Wrapper class)  (0) 2023.08.08