-
[TIL] 2022년 9월 22일 목요일카테고리 없음 2022. 9. 22. 17:16
4.4 StringReader와 StringWriter
- StringReader와 StringWriter는 CharArrayReader와 CharArrayWriter와 같이 입출력 대상이 메모리인 스트림
- StringWriter에 출력되는 데이터는 StringBuffer에 데이터를 저장하고 getBuffer()와 toString()와 같은 메소드를 통해 StringBuffer에 저장된 데이터를 얻을 수 있음
- 근본적으로 String도 char 배열이라면 거의 같은데 왜 두 개의 클래스가 있는걸까? CharArrayWriter는 reset() 메소드로 이미 할당된 버퍼를 버릴 필요 없이 다시 쓸 수 있도록 초기화할 수 있다는 것과 size() 메소드로 현재 버퍼 사이즈를 알 수 있다는 것 두 가지 메소드가 더 있고 거의 동일하다.
- 무엇이 다른가 싶어 검색해봤다. JDK 7 문서에 따르면 StringWriter는 StringBuffer가 있어 thread-safe하다고 되어있지만 CharArrayWriter는 단순하게 char 배열이 있다고 한다. 그렇다면 StringWriter는 thread-safe하고 CharArrayWriter는 thread-safe하지 않은가? 이런 의문을 품을 수 있기 때문에서인지 JDK 11 문서에서는 'thread-safe'라고 언급한 것이 사라졌다.
- JDK 11버전 문서는 CharArrayWriter에 대해 Writer를 char형 버퍼로 구현한 클래스로 스트림에 데이터를 출력할 때 버퍼가 자동으로 커진다고 말하고, StringWriter는 string을 만드는데 쓰이는 string buffer에 결과값을 쌓는 character stream이라고 되어있다. 해석이 제대로 되지 않아서 잘못 알고 있을 수 있지만 아무튼 char형 배열과 String을 쓴다는 것 외 다른게 없나보다.
5. 문자기반의 보조스트림
5.1 BufferedReader와 BufferedWriter
- BufferedReader와 BufferedWriter는 버퍼를 이용하여 입출력 효율을 높임
5.2 InputStreamReader와 OutputStreamWriter
- 바이트기반 스트림을 문자기반 스트림으로 연결하는 역할
- 바이트기반 스트림 데이터를 지정된 인코딩의 문자데이터로 변환
- 코딩 테스트를 연습할 때 BufferedReader(new InputStreamReader(System.in))을 사용했었는데 System.in이 InputStream인가보다.
더보기import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Properties; public class InputStreamReaderEx { public static void main(String[] args) { Properties prop = System.getProperties(); System.out.println(prop.get("sun.jnu.encoding")); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.printf("사용중인 OS의 인코딩 : %s \n", isr.getEncoding()); } }
- 교재에서는 MS949가 나왔는데 내 PC에서는 UTF-8이 나왔다. 예제 내용 중 신기한 메소드가 있어 확인해보니 String 클래스의 메소드였다. equalsIgnoreCase() 메소드이다. 두 문자열을 비교하여 같은 길이에 일치하고 대소문자 관계 없이 일치한다면 true를 반환한다. 아래 예제에서도 abc와 ABC를 비교할 때 equals는 false를 반환하지만 equalsIgnoreCase는 true를 반환한다. 사용할 기회가 된다면 사용해야겠다.
public class StringEx { public static void main(String[] args) { String input = "abc"; System.out.println(input.equals("ABC")); System.out.println(input.equalsIgnoreCase("ABC")); } } //false //true