자바 : PrintStream과 PrintWriter의 차이점


125

PrintStream과 의 차이점은 무엇입니까PrintWriter ? 그들은 공통적으로 많은 방법을 가지고 있기 때문에 종종이 두 클래스를 혼합합니다. 게다가 똑같은 용도로 사용할 수 있다고 생각합니다. 그러나 차이가 있어야합니다. 그렇지 않으면 클래스가 하나만있을 것입니다.

자료실을 검색했지만이 질문을 찾을 수 없습니다.


1
+1 좋은 질문입니다.이 두 클래스를 섞어서 API 문서도별로 도움이되지 않습니다.
helpermethod

또 다른 차이점은 자동 플러시 작동 방식입니다. 작성자의 경우 출력에 \ n 문자가 있으면 flush ()가 트리거됩니다. 그러나 바이트 스트림 (PrintStream)에는 바이트 만 있습니다. 그러면 autoflush는 "개행 문자가 아닌 줄 구분 기호에 대한 플랫폼 고유의 개념"을 기반으로 Javadoc에 설명 된대로 작동합니다.
mins

답변:


129

이 경박하지만 들릴 수도 PrintStream에 인쇄 OutputStream하고, PrintWriterA와 인쇄 Writer. 좋아, 나는 명백한 것을 말한 것에 대해 어떤 점수를 얻지 못할 것입니다. 하지만 더 있습니다.

그렇다면 an OutputStream과 a 의 차이점은 무엇 Writer입니까? 둘 다 스트림이며, 주요 차이점은 a OutputStream는 바이트 스트림이고 a Writer는 문자 스트림입니다.

OutputStream바이트를 다룬 다면 PrintStream.print(String)어떨까요? 기본 플랫폼 인코딩을 사용하여 문자를 바이트로 변환합니다. 기본 인코딩을 사용하는 것은 일반적으로 한 플랫폼에서 다른 플랫폼으로 이동할 때 버그가 발생할 수 있기 때문에 나쁜 일입니다. 특히 한 플랫폼에서 파일을 생성하고 다른 플랫폼에서 소비하는 경우에 그렇습니다.

와 함께 Writer 하면 일반적으로 사용할 인코딩을 지정하여 플랫폼 종속성을 방지합니다.

PrintStream주된 의도는 바이트가 아닌 문자를 쓰는 것이기 때문에 JDK에서 왜 귀찮게 합니까? PrintStreamReader / Writer 문자 스트림이 도입되었을 때 JDK 1.1보다 이전 버전입니다. Sun이 PrintStream널리 사용된다는 사실 때문에 더 이상 사용되지 않을 것이라고 생각 합니다. (결국, 각 호출 System.out이 더 이상 사용되지 않는 API 경고를 생성하는 것을 원하지 않을 것입니다 ! 또한 표준 출력 스트림 에서 유형을에서 PrintStream로 변경하면 PrintWriter기존 애플리케이션이 손상 될 수 있습니다.)


3
이것은 내가 생각했던 것이기도하지만 사실이 아닙니다. PrintStream조차도 내부에서 Writer를 유지합니다. OutputStream에 전달하면 래핑합니다.
Jon Skeet

3
@Jon-내부적으로는 Writer가 있지만 OutputStream에 쓰기 때문에 Net effect는 PrintStream이 OutputStream에 쓰는 것입니다. char에서 바이트로 변환이 발생하고 기본 플랫폼 인코딩을 사용합니다. PrintWriter에서 char-> byte 변환에 대한 그러한 요구 사항은 없습니다. 문자를 계속 사용할 수 있습니다.
mdma

"기본 문자 세트는 가상 머신 시작 중에 결정되며 일반적으로 기본 운영 체제의 로케일 및 문자 세트에 따라 다릅니다.", 또한 Locale은 일부 플랫폼에서 기본 문자 세트를 변경합니다.
Pindatjuh

7
Java 1.5부터는 PrintStream플랫폼 기본 인코딩을 사용하는 것으로 제한되지 않았습니다. 문자 집합 이름을 받아들이는 생성자가 있습니다. 따라서 구분 사이 PrintStreamPrintWriterA는 점이다 PrintWriter원시 바이트를 쓸 수 있고, 두 개의 클래스가 목적지의 다른 유형을 포장.
Ted Hopp 2013 년

1
인터페이스 PrintStreamprint()메서드 를 효과적으로 공유하는 동안 을 호출하는 편리한 함수가 write()활성화 된 경우 자동 플러시를 트리거하므로 동작의 상당한 차이를 주목할 가치가 있습니다 . PrintWriter반면에를 호출 한 후에는 자동 플러시되지 않습니다 print(). 저는 오늘 Java 초보자를 시연 해 왔으며 이것은 수동으로 플러시 할 필요성에 익숙하지 않은 일부 학생들을 잡았습니다. 그렇지 않으면 당신의 대답은 훌륭합니다.
Robadob

61

와 함께 PrintStream플랫폼의 기본 인코딩을 고수합니다.

PrintStream stream = new PrintStream(output);

으로 PrintWriter당신은 그러나를 전달할 수 있습니다 OutputStreamWriter특정 인코딩.

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

장점은 문자가 결국 mojibake 로 끝나지 않도록 문자를 작성해야하는 문자 인코딩을 제어 할 수 있다는 것입니다 .


12
1.4부터 인코딩을받는 PrintStream에 대한 새로운 생성자가 있습니다PrintStream(OutputStream out, boolean autoFlush, String encoding)
artbristol 2011

19

JDK 1.4부터는 PrintStream에 대한 문자 인코딩을 지정할 수 있습니다. 따라서 PrintStream과 PrintWriter의 차이점은 자동 플러시 동작에 관한 것이며 PrintStream이 Writer를 래핑 할 수 없다는 것입니다.


3

PrintWriter와 같은 작성기는 텍스트 출력용이고 스트림은 이진 출력용입니다. 작가는 당신을 위해 문자 세트를 처리합니다. 스트림은 바이너리 데이터를 엉망으로 만드는 그런 종류의 변환을 원하지 않는다고 가정했기 때문이 아닙니다. 그렇게했다면 라이터를 사용하게 될 것입니다.


1
PrintStream을 제외하고는 표준 OutputStream보다 조금 더 처리 할 수 ​​있도록 인코딩을 사용하기 때문입니다.
Simon Groenewolt

문자열을 인쇄하는 유일한 목표 인 System.out이 실제로 PrintStream이라는 것이 이상하게 들립니다.
mins

"작성자는 문자 집합을 처리합니다"-문자를 바이트로 변환하는 작성자 만 처리합니다. 모든 작가가 그렇게하는 것은 아닙니다.
Aivar 2015

2

Writer가 아닌 Stream에 원시 바이트를 쓸 수 있습니다. 의 PrintWriter 의 javadoc 목록 다른 차이 (가장 중요한 것은, 그것이 내가 말하고 싶지만 원시 바이트를 해석 할 수 있도록 스트림에 인코딩을 설정할 수있는).


PrintStream을 사용하면 인코딩도 지정할 수 있습니다
Aivar

1

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 메서드를 사용할 때 인쇄 작성자와 똑같이 작동합니다.


-3

Printwriter는 printstream의 향상된 기능입니다.

특정 목적을위한 IE 프린트 스트림.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.