입력된 값을 출력하는 방법 중 많이 사용되는 Buffered 종류를 통한 입력과 출력을 알아보고, 그 과정에 필요한 StringTokenizer 메서드를 함께 알아본다.
우선 지금부터 볼 버퍼 종류의 입출력은 키보드에 입력하는 즉시 프로그램에 전달되는 것이 아니다.
버퍼를 사용하는 입력은, 키보드의 입력이 있을 시 한 문자씩 버퍼로 전달되고 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 프로그램에 전달한다.
각각 정보를 프로그램에 전달하는게 좋을수도 있다고 생각하지만 데이터 입출력의 값이 많아지면 중간에 버퍼를 두어 한번에 묶어 보내는 것이 효율적이고 빠른 방법이다.
우선 BufferedReader는 입력을 해주는 메서드이다.
BufferedReader는 개행문자를 경계로 인식하고 (Enter 등) 입력받은 데이터의 형식이 String으로 고정이된다. 따라서 원하는 타입으로 형 변환을 해야하는 수고가 따른다.
하지만 많이 쓰는 Scannner보다 속도 면에서 훨씬 빠르다는 장점이 있다.
package BufferedReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Study_BufferedReader {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String s = br.readLine(); // 여기서 줄을 입력해줌
int i = Integer.parseInt(br.readLine()); // 줄을 입력해줌 (정수형)
}
}
위와 같이 사용할 수 있다. BufferedReader는 String으로 리턴값이 고정되어 있다. 따라서 다른 타입의 값을 얻고 싶으면 형변환을 해줘야한다. 위에서는 int 값으로 변환을 위해 Integer.parseInt()를 사용했다. 그리고 예외 처리가 꼭 필요하다.
그리고 이렇게 버퍼에 저장한 문자열을 가공하기 위해서는 어떻게 해야할까?
BufferedReaderd를 통해 버퍼에 입력 받은 값은 원형의 String 값이다. 따라서 그 정보를 읽고 싶다면, 문자열을 부분적으로 잘라주어 저장하는 것과 같은 처리를 해줘야한다.
이런일을 수행해주는 것이 StringTokenizer 이다.
StringTokenizer는 공백단위로 데이터를 가공해주는 메서드이다. 또한 이렇게 가공한 데이터는 하나하나 불러올 수 있는데, 아래 예시와 같다.
package BufferedReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Study_StringTokenizer {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String a = st.nextToken();
int i = Integer.parseInt(st.nextToken());
// 권권 0118 ==> 스페이스는 개행문자가 아니므로 연결해서 작성 가능
// 권권 ==> a 로
// 0118 ==> i 로 저장이 됨
System.out.println(a + i);
}
}
위와 같이 StirngTokenizer 초기화 할 때, br.readLine()을 통해서 문자를 입력 받고, st.nextToken()을 통해서 공백을 단위로 해서 받은 데이터를 저장할 수 있다.
StringTokenizer 와 비슷하게 사용되는 Split 를 알아보면, Split 는 정해진 기준을 통해서 문자열을 잘라서 String 배열에 저장해주는 메서드이다.
package BufferedReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Study_Split {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String s = br.readLine(); // 여기서 줄을 입력해줌
String arr[] = s.split(" "); // 오늘은 날이 좋습니다 !
System.out.println(Arrays.toString(arr)); // [오늘은, 날이, 좋습니다, !]
}
}
위는 스페이스를 기준으로 문자열을 잘라주었다. 문자열 하나하나 잘라주고 싶다면 "" 을 해주면 된다.
그리고 String 배열에 하나씩 담은 것도 Split 메서드의 특징이고 String클래스의 메서드로 들어가있다.
활용 방법에 따라 StringTokenizer와 Split를 따로 사용해주면 될 것이다.
BufferedWirter는 버퍼에 입력되어 있는 문자열을 출력해주는 용도로 사용한다.
package BufferedReader;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Study_BufferedWright {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 할당된 버퍼에 값 넣어주기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String string = br.readLine();
bw.write(string + "\n"); // 버퍼에 해당 값 입력
bw.flush(); // 데이터 모두 출력
bw.close(); // 스트림을 닫음
}
}
write로 출력하고 싶은 것을 출력해주고 끝내고 난 후에는 남은 버퍼를 모두 출력하는 flush() 를 사용한다. (모두 쏟아낸다) 그리고 close로 닫아줘야 한다.
또한 BufferedWriter는 자동 개행 기능이 없기 때문에 , 개행을 해주어야 할 경우는 \n 을 통해서 처리해줘야 한다.
import java.io.*;
public class Example {
public static void main(String[] args) {
try {
FileWriter writer = new FileWriter("output.txt");
BufferedWriter buffer = new BufferedWriter(writer);
buffer.write("Hello, World!");
buffer.newLine(); // 줄바꿈
buffer.write("안녕하세요!");
buffer.flush();
buffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ChatGPT 폼 미쳤다.
package BufferedReader;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Study_example {
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 n = Integer.parseInt(st.nextToken());
int max = Integer.parseInt(st.nextToken());
int[] arr = new int[n];
st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
int count = Integer.parseInt(st.nextToken());
arr[i] = count;
if(arr[i]<max){
bw.write(String.valueOf(arr[i])+" ");
}
}
br.close();
bw.flush();
bw.close();
}
}