JAVA의 빠른 입출력

hyeon·2022년 6월 7일
0

스터디

목록 보기
5/5

같은 로직이라도 System.in을 사용하는 Scanner와 System.out의 print보다 입력이 잦을수록 BufferedReader와 BufferedWriter를 사용하는 편이 빠르다.

BufferedReader

  • Scanner와 다르게 Line으로 입력받고 String형으로 입력받는다.
  • 파라매터로 InputStreamReader를 넣어준다. 그안에 System.in
  • throws IOException을 해줘야한다.
  • nextLine() 사용했던것처럼 readLine()을 사용해서 bufferedreader의 객체에 사용하여 한줄씩 읽을 수 있다.
public static main(String[] args) throws IOException{
	BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	String s=br.readLine();		//기본적으로 string으로 입력받음
    int a=Integer.parseInt(br.readLine());		//parseInt를 사용해서 Integer로 변경할 수 있음

	br.close();
}

데이터 가공

line 단위로 읽기 때문에 알고리즘 문제에 자주나오는 space 단위로 나누어져있을 때 가공이 필요하다.
주로 StringTokenizer에 nextToken()함수를 사용하여 space 단위로 나눌 수 있다.

StringTokenizer st=new StringTokenizer(s);
int a=Integer.parseInt(st.nextToken());
int b=Integer.parseInt(st.nextToken());

BufferedWriter

  • 파라매터로 OutputStreamWriter를 넣어준다. 그안에 System.out
  • throws IOException을 해줘야한다.
public static void main (String[] args) throws IOException{
	BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(System.out));
    bw.wirte("글자");
    bw.close();
    
}

Buffer와 Stream

BufferedReader와 BufferedWriter 둘다 buffer를 사용하기때문에 flush() close() 해주어야한다.

Buffer란?

데이터를 임시로 저장할 수 있는 공간이다. A와 B가 입출력을 수행하는데 있어서 속도 차이를 극복하기 위해 사용하는 임시저장 공간이다.

동영상에서의 버퍼

유튜브를 볼 때 회색부분이 버퍼라고 볼 수있다. 동영상이 내려 받아지는 속도와 비교해 우리가 동영상을 보는 속도에 차이가 있다. 동영상의 총 길이와 같은 속도로 내려받게 된다면 비효율적이므로 버퍼라는 임시저장공간에 최대한 빠른 시간안에 내려받아 저장해 둔다. 그래서 동영상이 받아지는 속도보다 보는속도가 더 빠르면 버퍼링이 걸린다고 표현한다.

입출력에서의 버퍼

CPU(중앙처리장치)와 보조 기억장치사이(물리적)에서 사용되는 임시저장 공간을 의미한다.
CPU는 빠르게 데이터를 처리할 수 있지만 보조기억장치는 느리다. 이 때 버퍼를 사용하면 CPU 내부에 있는 캐시 메모리 보다는 느리지만 보조기억장치보다는 훨씬 빠른 주기억장치(RAM)을 사용한다.

  1. 보조 기억장치는 주기억장치의 버퍼로 마련해둔 공간에 데이터를 열심히 보내 쌓아둔다.
  2. CPU는 자기할일을 하다가 시간이 남을 때 가끔 버퍼를 확인하여 데이터가 모두 쌓였는지 확인하고 다 쌓였다면 한꺼번에 처리한다.

=> 효율성이 높아진다.
버퍼는 속도차가 큰 대상이 입출력을 수행할 때 효율성을 위해 사용하는 임시저장 공간이다.

출처

Stream 이란?

다찬 버퍼를 전송하는 객체를 스트림이라고 한다.

동영상에서의 stream

영상을 시청할때 로딩하는것을 버퍼링, 실시간으로 송출할때는 스트리밍한다고 한다.
스트리밍은 방송인의 컴퓨터에서 시청자의 컴퓨터로 영상 데이터를 조금씩 전송하는 것이다.

BufferedReader 에서의 buffer와 stream

BufferedReader는 인자로 InputStreamReader를 취한다 이는 다시 System.in을 취한다. System.in은 InputStream을 리턴하고 사용자로부터 데이터를 입력받는다. InputStream은 입력스트림으로부터 데이터를 byte단위로 읽어오는 byte stream이다. InputStreamReader로 Reader 스트림형태로 변환된다. Reader Stream은 데이터를 character단위로 처리한다. BufferedReader는 Reader Stream에 버퍼링 기능을 추가한 입력 스트림 클래스이다. 일정량 사이즈로 읽어온 후 버퍼에 보관한다. 그 후 사용자가 요구시 버퍼에서 읽어온다.
BufferedReader가 사용자가 사용하기 편한 기능을 제공하기때문에 stream을 wrap한 것이다.

JAVA에서 Stream

stream은 데이터 입출력시 전송되는 데이터의 흐름이다. 자바에서 데이터 입출력시 시스템을 사용한 직접적인 작업은 JVM과 JVM의 라이브러리에 의해서 처리된다. 사용자는 단지 스트림을 통해 데이터를 송수신한다.
하지만 스트림은 자바에서만 지원하는 기능이 아니라 os 차원에서 지원하는 기능이다.
출처

profile
남기고 싶은 개발자입니다 :>

0개의 댓글