[Java] BufferedReader와 StringTokenizer

letsbebrave·2021년 12월 2일
0

Java

목록 보기
3/5

BufferedReader와 BufferedWriter

버퍼를 이용해서 읽고 쓰는 함수
버퍼를 이용하는 입력은 키포드 입력이 있을 때마다 한 문자씩 버퍼로 전송
버퍼가 가득 차거나, 개행문자가 나타나면 버퍼의 내용을 한 번에 전송


-> 중간에 메모리 버퍼를 둬서 데이터를 한 번에 묶어서 이동 시키는 게 효율적이고 빠름


vs. 버퍼를 사용하지 않는 입력 like Scanner
키보드 입력이 키를 누르는 즉시 바로 전달됨
키보드와 같은 외부 장치와의 데이터 입출력은 생각보다 시간이 많이 걸리는 작업


cf. 버퍼란?
데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 데이터를 보관하는 임시 메모리 영역
입출력 속도 향상을 위해 사용


버퍼 플러시란?
버퍼에 남아있는 데이터 출력시킴 (버퍼 비움)


일단 필요한 import는

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

BufferedReader

버퍼를 이용한 입력
readLine()을 사용하면 데이터를 라인 단위로 읽을 수 있음
but 리턴 값이 String으로 고정되므로!!!!! 다른 타입으로 입력 받으려면 형변환 필수

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int (String-> int로 형변환 필수)

bf.close(); // 입출력 끝난 후 닫아줘야

공백 단위로 데이터를 알려면 Scanner는 자동으로 해주었지만, StringTokenizer의 nextToken()함수를 이용해주어야 함

StringTokenizer

BufferedReader 클래스로 입력 읽어들일 때 라인으로 읽어들일 수 밖에 없으므로 스페이스 기준으로 문자열 분리 원할 때 사용하는 클래스
즉, 하나의 문자열을 여러 개의 토큰으로 분리할 때 쓰는 클래스


라이브러리 임포트

import java.util.StringTokenizer;

생성자

1.StringTokenizer st = new StringTokenizer(문자열);
띄어쓰기 기준으로 문자열 분리

2.StringTokenizer st = new StringTokenizer(문자열, 구분자);
구분자 기준으로 문자열 분리

3.StringTokenizer st = new StringTokenizer(문자열, 구분자, true/false);
구분자 기준으로 분리 시 구분자를 토큰에 넣을지(true), 안 넣을지(false - 디폴트)


용례

import java.util.StringTokenizer;
public class main
{
    public static void main(String[] args)
    {
       String str = "letsbebrave의 블로그는 velog에 있다";

       StringTokenizer st = new StringTokenizer(str, " ");

       System.out.println(st.nextToken());
       System.out.println(st.nextToken());
       System.out.println(st.nextToken());
       System.out.println(st.nextToken());
    }
}

결과

띄어쓰기 기준으로 문자열이 분리되어서 출력된 것을 볼 수 있다.
분리된 토큰을 확인하고 싶을 때는 nextToken()을 이용해서 확인할 수 있다!


BufferedReader와 StringTokenizer를 이용한 용례

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
// import java.io.*; 라고 줄여서 선언해줘도 됨

import java.util.StringTokenizer;
// 공백 단위로 알기 위한 import
 
public class Main {
 
	public static void main(String[] args) throws IOException { // 예외처리 필수
    
    	// 콘솔에서 입력받을 때 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
        
		int x = Integer.parseInt(st.nextToken());
		int y = Integer.parseInt(st.nextToken());
		int w = Integer.parseInt(st.nextToken());
		int h = Integer.parseInt(st.nextToken());
        
		int x_min = Math.min(x, w-x);	// x축 최소거리
		int y_min = Math.min(y, h-y);	// y축 최소거리
        
		// x와 y축 최소거리 중 가장 작은 값
		System.out.println(Math.min(x_min, y_min));
	}
 
}

References

https://jhnyang.tistory.com/398
https://st-lab.tistory.com/86

profile
그게, 할 수 있다고 믿어야 해

0개의 댓글