java.io.PrintWriter와 java.io.BufferedWriter의 차이점은 무엇입니까?


94

아래 코드를 살펴보십시오.

// A.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);

// B.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bWriter = new BufferedWriter(fileWriter);

이 두 가지 방법의 차이점은 무엇입니까?

언제 BufferedWriter보다 PrintWriter를 사용해야합니까?

답변:


61

BufferedWriterPrintWriter에 대한 API 참조 는 차이점을 자세히 설명합니다.

PrintWriter를 사용하는 주된 이유는 println ()과 같은 printXXX 메소드에 액세스하기 위해서입니다. System.out을 사용하여 콘솔에 쓰는 것처럼 기본적으로 PrintWriter를 사용하여 파일에 쓸 수 있습니다.

BufferedWriter는 파일에 쓰기를 수행하기 위해 C로 드롭하기 전에 (아마도 구현에 따라) Java 메모리의 문자를 버퍼링하므로 파일 (또는 기타)에 쓰는 효율적인 방법입니다.

"PrintReader"와 같은 개념은 없습니다. 가장 가까운 것은 아마도 java.util.Scanner 일 것입니다 .


4
@TritonMan은 어떤 시점에서 OS와 상호 작용해야하는데, 이는 Java 밖으로 나가는 것을 의미합니다.
TofuBeer 2016 년

89

PrintWriter더 많은 메소드 ( println)를 제공하지만 가장 중요한 (그리고 걱정스러운) 차이점은 예외를 삼킨다 는 것입니다 .

checkError나중에 호출 하여 오류가 발생했는지 확인할 수 있지만 일반적으로 PrintWriter콘솔에 쓰는 것과 같은 작업에 사용 하거나 예외로 인해 귀찮게하고 싶지 않은 "빠르고 더러운"앱에서 사용합니다. 장기적인 신뢰성은 문제가되지 않습니다).

"추가 서식 기능"과 "예외를 삼키지 마십시오"측면이 동일한 클래스에 번들로 포함 된 이유를 잘 모르겠습니다. 서식 지정은 예외를 삼키고 싶지 않은 많은 장소에서 분명히 유용합니다 . BufferedWriter어느 시점에서 같은 능력을 얻는 것을 보는 것이 좋을 것입니다 ...


@WindyFields : 아니, PrintStream입니다 OutputStream. PrintWriter입니다 Writer.
Jon Skeet

감사. "예외를 삼킨다." PrintWriter가 확인 된 예외를 발생시키지 않는다는 의미입니까? 확인되지 않은 엑세 피톤은 어떻습니까?

@ 벤 : 내가 특별히 대해 말하고 IOException다른 모든 IO 추상화 (점에서, Reader, Writer등)의 방법을 던질 것을 선언 IOException뭔가 잘못되면 - PrintWriter하지 않습니다.
Jon Skeet

8

TofuBeer의 답변에서 말했듯이 둘 다 전문성이 있습니다. PrintWriter (또는 다른 작성기)를 최대한 활용하고 버퍼링 된 쓰기를 사용하려면 다음과 같이 필요한 것으로 BufferedWriter를 래핑 할 수 있습니다.

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));

2
@Jons는 PrintWriter가 예외를 삼킬 것이라는 주석을 기억합니다. checkError를 호출해야합니다.
MadMurf

1
나는 로얄 테넌바움 사랑
Ogen

4
적어도 현재 openJDK 8 구현 (및 아마도 이전 버전)에서는 PrinterWriter이미 BufferedWriter.
nimrodm

7

PrintWriter는 문자 모드의 모든 Writer에 인쇄 메서드를 노출합니다.

BufferedWriter는 버퍼링 된 메서드에 따라보다 효율적입니다. 또한 시스템 플랫폼에 따라 텍스트 파일을 올바르게 조작하기 위해 newLine () 메서드가 제공됩니다.

BufferedReader는 문자로 변환 된 바이트를 사용하여 파일에서 텍스트를 읽을 수 있습니다. 한 줄씩 읽을 수 있습니다.

PrintReader가 없으므로 입력 형식에 따라 다른 Reader 구현을 선택해야합니다.


3

PrintWriter 는 파일에 문자 데이터를 쓰는 가장 향상된 작성기입니다.

FileWriter 및 BufferedWriter에 비해 PrintWriter의 주요 장점은 다음과 같습니다.

  1. PrintWriter는 파일과 직접 통신 할 수 있으며 일부 Writer 개체를 통해 통신 할 수도 있습니다.

PrintWriter printwriter = new PrintWriter("blah.txt");

(또는)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. 모든 유형의 Primitive 데이터를 파일에 직접 쓸 수 있습니다 (왜냐하면 PrintWriter 메서드의 추가 오버로드 버전, 즉 print () 및 println ()이 있기 때문).

    printwriter.print(65); //65
    bufferedwriter.write(65); //A
    printwriter.println(true); //true


2

일반적으로 작성기는 출력을 기본 문자 또는 바이트 스트림으로 즉시 보냅니다. 프롬프트 출력이 필요하지 않으면 FileWriter 및 OutputStreamWriter와 같이 write () 작업에 비용이 많이들 수있는 모든 Writer 주위에 BufferedWriter를 래핑하는 것이 좋습니다. 예를 들면

참고 : 코드 블록의 텍스트 콘텐츠는 자동으로 자동 줄 바꿈됩니다.

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

PrintWriter의 출력을 파일에 버퍼링합니다. 버퍼링이 없으면 print () 메서드를 호출 할 때마다 문자가 바이트로 변환되어 파일에 즉시 기록되므로 매우 비효율적 일 수 있습니다.


0

BufferedWriter-문자 스트림에서 문자를 버퍼링하여 출력 문자 스트림에 텍스트를 씁니다. PrintWriter-개체의 형식화 된 표현을 텍스트 출력 스트림으로 인쇄합니다.


-1

PrintWriter를 사용하는 이유는 이미 위에서 언급했지만 중요한 이유 중 하나는 파일 객체를 PrintWriter 생성자에 직접 전달하여 사용하기 쉽기 때문이라고 생각합니다.

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.