데이터는 키보드를 통해 입력될 수도 있고, 파일 또는 프로그램으로부터 입력될 수 있다. 반대로 데이터는 모니터로 출력될 수도 있고, 파일에 저장되거나 다른 프로그램으로 전송할 수 있다. 이것을 총칭해서 데이터 입출력이라고 한다.
※ 입출력 단위 : 스트림(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 |