Study/Java

Java: BufferedReader / Writer와 StringTokenizer의 개념과 이해

devyoseph 2021. 10. 10. 07:26
버퍼(Buffer)
일종의 데이터를 담아둘 수 있는 이다. 원래 사용자가 키보드에서 값을 입력할 때마다 입력값을 하나씩 전송하는데 이것은 효율이 낮다. 메모리 영역인 버퍼를 통해 데이터를 모아두고 일시적으로 보냄으로 효율을 높힌다. 문자열 데이터로 이동하며 Input와 Output의 버퍼가 각각 다르다. Stream 방식(단방향, blocking)으로 작동하고 입력은 InputStream, 출력은 OutputStream을 사용한다. 사용을 끝내고 닫아주지 않으면 메모리 누수가 발생한다.

입력(I): BufferedReader
사용자의 입력값(input)을 한번에 모아 전송한다. I/O와 관련한 IOException예외 사용이 필수다.
입력시 사용하는 Stream은 InputStream이며 시스템에서 입력받은 값(System.in)의 통로가 된다
public static void main(String[] args) throws IOException {
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//BufferReader의 메모리 영역을 할당(인스턴스화)하고 통로를 InputStreamReader로 정해준다
//사용자가 현재 시스템에서 값을 받는다는 것을 지정한다(System.in)
}
사용자에게서 입력값 받기: .readLine();
문자열 데이터
로 이동하기 숫자 데이터를 활용하려면 형변환이 필수다
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       String s = br.readLine();
       System.out.println(s);
}
}

*숫자 연산이 필요없는 경우

import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   int N = Integer.parseInt(br.readLine());
       System.out.println(N*100);
//연산이 필요한 경우 형변환을 거쳐야 한다
}
}

*숫자 연산이 필요한 경우

 

출력(O): BufferedWriter
출력값(output)을 한번에 모아 전송한다. I/O와 관련한 IOException예외 사용이 필수다.
입력시 사용하는 Stream은 OutputStream이며 시스템에서 출력할 값(System.out)의 통로가 된다
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//입력과 출력의 통로에 쓰이는 통로가 각각 다르므로 각각 메모리를 지정해줘야한다
}
}
출력은 3단계로 이루어진다: buffer에 기록하기 → 출력하기 → buffer닫기
문자열 데이터로 이동하기 숫자 데이터를 출력하려면 형변환이 필수다
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	  
	   int N = Integer.parseInt(br.readLine());
//BufferedReader의 readLine메소드를 통해 N에 변수를 담았다

	   for(int i =0; i<5; i++) {
    	   bw.write(String.valueOf(N*i));
//연산을 하고 나서 결과값을 다시 문자열로 변환시키고 넣어줘야한다
    	   bw.newLine();
//bw.newLine();으로 줄바꿈을 할 수 있다 (혹은 bw.write("\n"); 사용)
       }
       
	   bw.flush(); //기록한 값을 한번에 출력한다
	   bw.close(); //메모리 누수를 막기 위해 버퍼를 닫아준다
}
}

 

StringTokenizer: 입력값을 쪼개서 저장하기
BufferedReader의 단점은 줄바꿈(\n)밖에 구분을 못한다.
입력값으로 "Hello World"가 주어지면 버퍼는 Hello와 World를 구분할 수 없는데 이 부분을 도와주는 것이 StringTokenizer이다
어떤 기준으로 값을 쪼개서 가져오는지 입력해준다.
StringTokenizer st = new StringTokenizer(br.readLine(), "구분할 문자나 공백(=구분자)");
*구분자를 여러개 등록하는 법: | 사용 → StringTokenizer st = new StringTokenizer(br.readLine(), "+|-");
자주 사용하는 StringTokenizer 메소드
.countTokens(); 총 토큰의 개수 int count = st.countTokens();
.nextToken(); 저장된 토큰값을 불러오고 삭제 sum = Integer.parseInt(st.nextToken());
.hasMoreTokens() //boolean 토큰이 있으면 true 없으면 false를 반환 while(st.hasMoreTokens())//while과 세트
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	   StringTokenizer st = new StringTokenizer(br.readLine(), " ");
//" "이므로 띄어쓰기를 기준으로 토큰에 값을 나누어 저장한다
	   int count = st.countTokens();
//위 변수는 여기선 쓰이지 않지만 토큰의 개수를 담았다
	   int sum = 0;
	   while(st.hasMoreTokens()){
		   sum += Integer.parseInt(st.nextToken());
//연산을 위해 버퍼 문자열을 숫자데이터로 형변환해줘야 한다
       }
	   bw.write(String.valueOf(sum));
//출력을 위해 연산의 결과값인 숫자데이터 sum을 다시 문자열로 바꾼다
	   bw.flush();
	   bw.close();
}
}

1 4 5 6 7 입력과 결과값 23