1 minute read


layout: post title: “자바와 Buffer” —-

Buffer

두 장치간 입출력 속도차이로 인한 처리지연을 막기 위해 도입됨
image
예시에서 디스크와 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을 입력하면
버퍼에 있는 모든 내용을 한번에 전송한다

image
위의 방식이 기존에 내가 항상 쓰던 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();

Updated: