PrintStream
과 의 차이점은 무엇입니까PrintWriter
? 그들은 공통적으로 많은 방법을 가지고 있기 때문에 종종이 두 클래스를 혼합합니다. 게다가 똑같은 용도로 사용할 수 있다고 생각합니다. 그러나 차이가 있어야합니다. 그렇지 않으면 클래스가 하나만있을 것입니다.
자료실을 검색했지만이 질문을 찾을 수 없습니다.
PrintStream
과 의 차이점은 무엇입니까PrintWriter
? 그들은 공통적으로 많은 방법을 가지고 있기 때문에 종종이 두 클래스를 혼합합니다. 게다가 똑같은 용도로 사용할 수 있다고 생각합니다. 그러나 차이가 있어야합니다. 그렇지 않으면 클래스가 하나만있을 것입니다.
자료실을 검색했지만이 질문을 찾을 수 없습니다.
답변:
이 경박하지만 들릴 수도 PrintStream
에 인쇄 OutputStream
하고, PrintWriter
A와 인쇄 Writer
. 좋아, 나는 명백한 것을 말한 것에 대해 어떤 점수를 얻지 못할 것입니다. 하지만 더 있습니다.
그렇다면 an OutputStream
과 a 의 차이점은 무엇 Writer
입니까? 둘 다 스트림이며, 주요 차이점은 a OutputStream
는 바이트 스트림이고 a Writer
는 문자 스트림입니다.
OutputStream
바이트를 다룬 다면 PrintStream.print(String)
어떨까요? 기본 플랫폼 인코딩을 사용하여 문자를 바이트로 변환합니다. 기본 인코딩을 사용하는 것은 일반적으로 한 플랫폼에서 다른 플랫폼으로 이동할 때 버그가 발생할 수 있기 때문에 나쁜 일입니다. 특히 한 플랫폼에서 파일을 생성하고 다른 플랫폼에서 소비하는 경우에 그렇습니다.
와 함께 Writer
하면 일반적으로 사용할 인코딩을 지정하여 플랫폼 종속성을 방지합니다.
PrintStream
주된 의도는 바이트가 아닌 문자를 쓰는 것이기 때문에 JDK에서 왜 귀찮게 합니까? PrintStream
Reader / Writer 문자 스트림이 도입되었을 때 JDK 1.1보다 이전 버전입니다. Sun이 PrintStream
널리 사용된다는 사실 때문에 더 이상 사용되지 않을 것이라고 생각 합니다. (결국, 각 호출 System.out
이 더 이상 사용되지 않는 API 경고를 생성하는 것을 원하지 않을 것입니다 ! 또한 표준 출력 스트림 에서 유형을에서 PrintStream
로 변경하면 PrintWriter
기존 애플리케이션이 손상 될 수 있습니다.)
PrintStream
플랫폼 기본 인코딩을 사용하는 것으로 제한되지 않았습니다. 문자 집합 이름을 받아들이는 생성자가 있습니다. 따라서 구분 사이 PrintStream
와 PrintWriter
A는 점이다 PrintWriter
원시 바이트를 쓸 수 있고, 두 개의 클래스가 목적지의 다른 유형을 포장.
PrintStream
의 print()
메서드 를 효과적으로 공유하는 동안 을 호출하는 편리한 함수가 write()
활성화 된 경우 자동 플러시를 트리거하므로 동작의 상당한 차이를 주목할 가치가 있습니다 . PrintWriter
반면에를 호출 한 후에는 자동 플러시되지 않습니다 print()
. 저는 오늘 Java 초보자를 시연 해 왔으며 이것은 수동으로 플러시 할 필요성에 익숙하지 않은 일부 학생들을 잡았습니다. 그렇지 않으면 당신의 대답은 훌륭합니다.
와 함께 PrintStream
플랫폼의 기본 인코딩을 고수합니다.
PrintStream stream = new PrintStream(output);
으로 PrintWriter
당신은 그러나를 전달할 수 있습니다 OutputStreamWriter
특정 인코딩.
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
장점은 문자가 결국 mojibake 로 끝나지 않도록 문자를 작성해야하는 문자 인코딩을 제어 할 수 있다는 것입니다 .
PrintStream(OutputStream out, boolean autoFlush, String encoding)
PrintWriter와 같은 작성기는 텍스트 출력용이고 스트림은 이진 출력용입니다. 작가는 당신을 위해 문자 세트를 처리합니다. 스트림은 바이너리 데이터를 엉망으로 만드는 그런 종류의 변환을 원하지 않는다고 가정했기 때문이 아닙니다. 그렇게했다면 라이터를 사용하게 될 것입니다.
Writer가 아닌 Stream에 원시 바이트를 쓸 수 있습니다. 의 PrintWriter 의 javadoc 목록 다른 차이 (가장 중요한 것은, 그것이 내가 말하고 싶지만 원시 바이트를 해석 할 수 있도록 스트림에 인코딩을 설정할 수있는).
Horstmann의 코어 자바 에서
Java 베테랑은 PrintStream 클래스와 System.out에 무슨 일이 일어 났는지 궁금 할 것입니다. Java 1.0에서 PrintStream 클래스는 상단 바이트를 삭제하여 모든 유니 코드 문자를 ASCII 문자로 자릅니다. (당시 유니 코드는 여전히 16 비트 인코딩이었습니다.) 분명히 이것은 깔끔하거나 이식 가능한 접근 방식이 아니었고 Java 1.1에 독자와 작성자가 도입되면서 수정되었습니다. 기존 코드와의 호환성을 위해 System.in, System.out 및 System.err은 여전히 읽기 / 쓰기가 아닌 입력 / 출력 스트림입니다. 그러나 이제 PrintStream 클래스는 PrintWriter와 동일한 방식으로 내부적으로 유니 코드 문자를 기본 호스트 인코딩으로 변환합니다. PrintStream 유형의 객체는 print 및 println 메서드를 사용할 때 인쇄 작성자와 똑같이 작동합니다.