입출력 스트림 (I/O Stream)은 모두 Byte Stream!!
입출력 시 모두 Buffer 사용
Buffer는 용량이 꽉 차거나, \n (엔터) 포함 시 flush
1. I/O Stream
- 입출력 스트림은 Byte Stream과 Character Stream 두 가지를 사용
- Character Stream도 Byte Stream
2. InputStream
- 입력을 받는 입력 스트림을 구현하는 객체
- 바이트로 전송하기 때문에 아스키 코드 (숫자)로 반환
package ex18;
import java.io.IOException;
import java.io.InputStream;
public class Buffer01 {
public static void main(String[] args) {
// 시스템 Input을 받기 위한 객체 : InputStream
InputStream in = System.in;
try {
// 키보드에서 입력받은 글자를 아스키 코드로 반환
int r = in.read();
System.out.println(r);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
3. InputStreamReader, BufferedReader
- Character Stream을 사용하며, 문자를 자동 casting하고, ‘\n’을 확인하면 자동으로 파싱
- InputStreamReader는 저장 공간이 고정되어 있음
- BufferedReader는 저장 공간이 가변적임
package ex18;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Buffer02 {
public static void main(String[] args) {
InputStream in = System.in;
InputStreamReader rd = new InputStreamReader(in);
// 배열 : 고정 크기의 버퍼
char[] buf = new char[4];
try {
// 키보드 입력 대기
rd.read(buf);
System.out.println(buf[0]);
System.out.println(buf[1]);
System.out.println(buf[2]);
System.out.println(buf[3]);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
package ex18;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;
public class Buffer03 {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
/*
위의 코드는 아래 3줄의 코드를 1줄로 요약한 것 : 데코레이터 패턴
InputStream in = System.in;
InputStreamReader rd = new InputStreamReader(in);
BufferedReader br = new BufferedReader(rd);
*/
try {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
4. OutputStreamWriter, BufferedWriter
- 입력 스트림이 아닌 출력 스트림
- Character Stream 사용
- ‘\n’을 붙이지 않거나, 버퍼가 꽉 차지 않는다면 Flush 불가
- flush() 메서드로 직접 flush 가능
package ex18;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
// 버퍼는 꽉 차야 전송됨
// 프로토콜 : '\n'을 함께 보내야 읽음 (엔터)
public class Buffer04 {
public static void main(String[] args) {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
try {
bw.write("안녕\n");
bw.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
5. 쉬운 Writer 및 Reader
- PrintWriter : 출력 스트림을 사용하며, 버퍼가 꽉 차지 않더라도 자동 flush 가능
- Scanner : 입력 스트림을 사용하며, 버퍼가 꽉 차지 않아도 ‘\n’을 확인해서 자동 파싱
package ex18;
import java.io.PrintWriter;
import java.util.Scanner;
public class Buffer05 {
public static void main(String[] args) {
// PrintWriter : BufferedWriter에 AutoFlush 추가
PrintWriter out = new PrintWriter(System.out, true);
out.println("Hello World");
// Scanner : BufferedReader
Scanner in = new Scanner(System.in);
String s = in.nextLine();
System.out.println(s);
}
}
1. Stream 예제
Share article