버퍼링 : 입출력 장치와 느린 속도를 보완해 주는 방법으로 주기억 장치의 일부를 보퍼로 이용하여 데이터를 처리하는 것이다.
BufferedReader 는 8192 char(16,384byte) 크기를 가지며 반면 Scanner 는 1024 char 의 사이즈를 가지므로 많은 입력에는 BufferedReader 가 유리하다.
또한 BufferedReader 는 동기화가 되기에 멀티 쓰레드 환경에서 안전하다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
예외처리가 반드시 필요하며 throws IOException 으로 해결 가능하다.
BufferedReader 을 통해 읽어온 데이터를 공백 단위로 데이터를 가공해주려면 StringTokenizer 또는 String.split() 함수를 이용해야만 한다.
// StringTokenizer
// 공백 단위로 구분해여 호출 가능
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// StringTokenizer 2)
Stringtokenizer st = new StringTokenizer(br.readLine(), "구분할 문자", delim check)
while(st.hasMoreTokens()){...}
// String.split() 함수
// 배열에 저장 가능
String s = br.readLine();
String arr[] = s.split(" ");
쓰기 역시 많은 양의 출력이 있을 때 입력과 동일하게 버퍼를 사용하는 것이 좋다.
BufferedWriter 는 출력과 개행을 동시에 해주지 않기에 따로 처리가 필요하다. BufferedWriter 사용후에는 출력이 덜 끝났다면 flush(), 스트림을 닫으려면 close() 함수가 필요하다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
String 과 StringBuffer/StringBuilder 에 대해서 알아보자
String 은 불변성의 성격을 지니며 연산을 통해 값이 바뀌게 되면(ex : concat) 기존의 String 메모리에서 값이 바뀌는 것이 아니라, 기존의 String에 들어있던 값을 버리고 새로운 값을 재할당 받는다.
처음에 할당된 String 의 메모리 영역은 Garbage 로 남아있다가 GC 에 의해 없어지며 문자열 연산이 자주 이루어 지면, Heap 메모리에 많은 Garbage 가 생성되어, Heap 메모리 부족으로 프로그램 성능에 악영향을 미치며 StringBuffer/StringBuilder 에 비해 속도가 현저히 느리다.
StringBuffer/StringBuilder 는 가변성을 가지며 append(), delete() 등 동일 객체 내에서 문자열 변경이 가능하다.
StringBuffer 는 동기화를 지원하여 멀티 쓰레드 환경에서 안전하다.
StringBuilder 는 동기화를 지원하지않지만 단일 쓰레드에서는 StringBuffer 보다 성능이 뛰어나다.
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b").append(" ");
sb.append("c").append("\n");
StringBuilder 주요 메서드
StringBuilder append(String s) : StringBuilder 뒤에 값을 붙임
StringBuilder delete(int start , int end) : 특정 인덱스부터 인덱스까지를 삭제
StringBuilder insert(int offet, any primitive of a char[]) : 문자를 삽입
StringBuilder subString(int start, int end) : start와 end 사이의 값을 자름
StringBuilder replace(int start , int end , String s) : 일부를 String 객체로 치환
StringBuilder reverse() : 순서를 뒤집음
StringBuilder setCharAt(int index , char ch) : 주어진 문자로 치환
StringBuilder indexOf(String s) : 값이 어느 인덱스에 들어있는지 확인
https://reakwon.tistory.com/90
https://onlyfor-me-blog.tistory.com/368
https://rlakuku-program.tistory.com/33