ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

Designed by Tistory.