Buffer
layout: post title: “자바와 Buffer” —-
Buffer
두 장치간 입출력 속도차이로 인한 처리지연을 막기 위해 도입됨

예시에서 디스크와 CPU의 성능 차이를 볼 수 있다
만약 중간에 버퍼 역할을 하는 메모리가 없다면
CPU는 디스크에서 진행하는 1개의 연산을 기다리기 위해 대기해야 한다
이때 데이터 유실이 발생할 수 있다
반면에 버퍼가 있다면 처리된 50개 연산을 메모리에 저장 뒤
CPU는 나머지 50개 연산을 진행하고
디스크는 하나의 연산을 진행 뒤 버퍼에 전달한다
그러면 메모리 버퍼에 데이터가 저장이 되어 있어 디스크와 CPU에게
적절하게 필요한 데이터를 전달한다
자바의 I/O
모든 input, output은 스트림(stream)을 통해 이루어진다
- Stream
Byte 형태로 데이터를 운반하는 연결통로
단방향 통신만 가능하여 입력, 출력이 동시에 가능하지 않으며
queue의 FIFO 구조로 이루어짐
- Stream 활용
Reader : input Stream
Writer : output stream
inputStream은 한 줄씩 시스템에 입력되는 값을 읽고
outputStream으로 데이터를 내보내며 공간을 비운다
그리고 출력 이후out.flush()와out.close()를 써서 마무리해야한다
import java.io.inputStream;
import java.io.outputStream;
InputSystem in = System.in;
OutputSystem out = System.out;
int streamData = in.read();
out.write(streamData);
out.flush();
out.close();
를 통해 데이터를 입출력하면 입력받은 문자 중 가장 앞의 글자만 출력된다
그래서! inputStreamReader와 outputStreamReader를 통해
2개 이상의 데이터를 배열로 받을 수 있다
하지만 저 방법도 고정된 값만큼 데이터를 받을 수 있으므로 buffer를 사용한다
Java에서 buffer 사용
버퍼는 고정값이 아닌 가변값을 받게 된다
버퍼 메모리가 꽉 차거나 개행문자인 \n을 입력하면
버퍼에 있는 모든 내용을 한번에 전송한다

위의 방식이 기존에 내가 항상 쓰던 scanner라고 생각하면 된다
import java.io.BufferReader;
import java.io.BufferWriter;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(sb.toString());
bw.newLine(); // 개행 메소드
bw.flush();
bw.close();
br.close();