2024. 7. 17. 16:22ㆍ개발/☕ JAVA
Java 입출력 스트림
입출력은 잘 알다시피 키보드로부터 데이터를 '입력'받고 화면을 통해 '출력'하는 과정을 의미한다.
Java에서는 입출력을 스트림이라는 방식을 통해서 수행한다.
스트림 : 데이터를 운반하는 데 사용되는 연결 통로
- 단방향 통신만 가능 ( Source -> Input Stream -> OutputStream -> Sink )
- FIFO(First In First Out) 구조
- 입력과 출력을 동시에 수행하려면 입력을 위한 입력 스트림, 출력을 위한 출력 스트림 총 2개가 필요
나는 여태까지 입력받을 때는 Scanner, 출력할 때는 System.out.println() 이런 애들만 사용해왔는데
데브코스에서 다른 분들의 코드를 보니까 대부분 입출력을 BufferedReader와 BufferedWriter를 통해 수행하는 것 같았기 때문에
BufferedReader와 BufferedWriter에 대해서 좀 공부해봤다
우선 BufferedReader와 BufferedWriter 코드를 살펴보면
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
엄청 길다...
BufferedReader와 BufferedWriter 코드를 자세히 살펴보면 Java의 입출력 스트림의 역사(?)를 알 수 있는데
InputStream in = System.in;
InputStreamReader ir = new InputStreamReader(in);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
OutputStream out = System.out;
OutputStreamWriter ow = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
이러하다...
간단하게 정리하자면
InputStream / OutputStream : 하나의 값만 입출력 가능
InputStreamReader / OutputStreamWriter : 여러개의 값 입출력 가능하지만 2개 이상부터는 고정된 배열에 저장하는 방식
BufferedReader / BufferedWriter : 여러개의 값 입출력이 가능하며 Buffer라는 가변적인 배열에 저장하는 방식
이런 흐름으로 스트림이 발전해왔다는 것이다!
마지막으로 BufferedReader/BufferedWriter의 특징과 사용 예시를 정리해보겠다!
BufferedReader / BufferedWriter
- InputStreamReader / OutputStreamWriter가 고정적인 배열을 사용한다는 단점 보완
- Buffer라는 가변적인 배열 활용
- Buffer가 가득 차거나 개행문자가 들어오면 Buffer에 저장되어 있던 내용을 한번에 전송
- 장점 : 빠르다 / 가변적인 배열을 사용하기 때문에 공간 낭비 없음
- 단점 : 개행문자(엔터)에만 Buffer의 내용이 전송되기 때문에 띄어쓰기 단위로 데이터를 받고 싶다면 가공이 필수적
BufferedReader 사용 예시
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//입력받기
String s = bf.readline(); //default : String
int i = Integer.parseInt(bf.readLine()); //int 변환
//띄어쓰기 단위로 데이터 가공
//*StringTokenizer 사용
StringTokenizer st = new StringTokenizer(s); //StringTokenizer에 입력 문자열 삽입
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
//*String.split() 사용
String array[] = s.split(" ");
BufferedWriter 사용 예시
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(s);//출력
bw.newLine();//줄바꿈
bw.flush();//버퍼에 남아있는 데이터 모두 출력
bw.close();//스트림 닫음
'개발 > ☕ JAVA' 카테고리의 다른 글
☕ Java 예외 처리 (0) | 2024.07.26 |
---|---|
☕ Java 다형성 ( 오버라이딩, 오버로딩 ) (1) | 2024.07.24 |
☕ Java 상속 ( super, 업캐스팅 / 다운캐스팅, instanceof ) (0) | 2023.06.15 |
☕ Java 캡슐화 ( 클래스/객체, 변수/메서드, 제어자, 생성자, this, getter/setter ) (0) | 2023.06.14 |
☕ Java의 객체 지향적 특징 (추상화, 캡슐화, 상속, 다형성) (0) | 2023.06.12 |