Różnica między java.io.PrintWriter a java.io.BufferedWriter?

97

Proszę przejrzeć poniższy kod:

// 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);

Jaka jest różnica między tymi dwiema metodami?

Kiedy powinniśmy używać PrintWriter zamiast BufferedWriter?

i2ijeya
źródło

Odpowiedzi:

63

Dokumentacja interfejsu API dla BufferedWriter i PrintWriter szczegółowo opisuje różnice.

Głównym powodem używania PrintWriter jest uzyskanie dostępu do metod printXXX, takich jak println (). Zasadniczo możesz użyć PrintWriter do zapisu do pliku, tak jak używałbyś System.out do zapisu na konsoli.

BufferedWriter to skuteczny sposób zapisu do pliku (lub czegokolwiek innego), ponieważ będzie buforował znaki w pamięci Java przed (prawdopodobnie w zależności od implementacji) upuszczeniem do C, aby wykonać zapis do pliku.

Nie ma takiej koncepcji jak „PrintReader”; najbliższy uzyskany wynik to prawdopodobnie java.util.Scanner .

TofuBeer
źródło
4
@TritonMan w pewnym momencie musi wejść w interakcję z systemem operacyjnym, co oznacza wyjście poza Javę.
TofuBeer
ale PrintWriter jest również buforowany, prawda? więc nie ma między nimi różnicy, jak może sugerować twoja odpowiedź
wiersz
90

PrintWriterpodaje więcej metod ( println), ale najważniejszą (i niepokojącą) różnicą, o której należy pamiętać, jest to, że połyka wyjątki .

Możesz zadzwonić checkErrorpóźniej, aby sprawdzić, czy nie wystąpiły jakiekolwiek błędy, ale zazwyczaj używasz PrintWriterdo takich rzeczy, jak pisanie na konsoli - lub w „szybkich i brudnych” aplikacjach, w których nie chcesz, aby przeszkadzały Ci wyjątki (i gdzie długoterminowa niezawodność nie jest problemem).

Nie jestem pewien, dlaczego aspekty „dodatkowych możliwości formatowania” i „nie połykaj wyjątków” są zawarte w tej samej klasie - formatowanie jest oczywiście przydatne w wielu miejscach, w których nie chcesz, aby wyjątki były połykane. Byłoby miło zobaczyć, BufferedWriterże w pewnym momencie te same umiejętności ...

Jon Skeet
źródło
@WindyFields: Nie, PrintStreamto plik OutputStream. PrintWriterjest Writer.
Jon Skeet
Dzięki. „Połyka wyjątki”. Czy masz na myśli, że PrintWriter nie zgłasza sprawdzonych wyjątków? A co z niesprawdzonymi wyjątkami?
1
@Ben: byłem specjalnie mówisz IOException, że co drugi abstrakcja IO ( Reader, Writeretc) deklaruje, że jej metody rzucać IOException, jeśli coś pójdzie nie tak - PrintWriternie.
Jon Skeet
8

Jak powiedziano w odpowiedzi TofuBeera, obie mają swoje specjalności. Aby w pełni wykorzystać PrintWriter (lub dowolnego innego pisarza), ale także użyć buforowanego zapisu, możesz opakować BufferedWriter potrzebnym w następujący sposób:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
Kai Huppmann
źródło
2
Pamiętając komentarz @Jons, że PrintWriter połknie wyjątki. Należy wywołać checkError.
MadMurf
4
Przynajmniej w obecnej implementacji openJDK 8 (i prawdopodobnie starszych wersjach) PrinterWriterjuż tworzy plik BufferedWriter.
nimrodm
7

PrintWriter po prostu ujawnia metody drukowania na dowolnym programie Writer w trybie znakowym.

BufferedWriter jest bardziej wydajny niż, zgodnie z jego buforowanymi metodami. I jest wyposażony w metodę newLine (), w zależności od platformy systemowej, do poprawnego manipulowania plikami tekstowymi.

BufferedReader umożliwia odczytanie tekstu z pliku z bajtami przekonwertowanymi na znaki. Pozwala czytać wiersz po wierszu.

Nie ma PrintReadera, musisz wybrać inną implementację czytnika zgodnie z formatem wprowadzonych danych.

Lioda
źródło
3

PrintWriter to najbardziej zaawansowany program Writer do zapisywania danych znaków w pliku.

Główną zaletą PrintWriter w porównaniu z FileWriter i BufferedWriter jest:

  1. PrintWriter może komunikować się bezpośrednio z plikiem i może również komunikować się za pośrednictwem jakiegoś obiektu Writer.

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

(lub)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. Możemy bezpośrednio do pliku zapisać dowolny typ danych Primitive (ponieważ mamy dodatkowe przeciążone wersje metod PrintWriter tj. Print () i println ()).

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

Syed Maqsood
źródło
2

Ogólnie rzecz biorąc, Writer wysyła swoje dane wyjściowe natychmiast do bazowego strumienia znaków lub bajtów. O ile nie jest wymagane szybkie wyjście, zaleca się zawinięcie BufferedWriter do dowolnego modułu Writer, którego operacje write () mogą być kosztowne, takiego jak FileWriters i OutputStreamWriters. Na przykład,

Uwaga: Treść tekstowa w blokach kodu jest automatycznie zawijana

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

buforuje wyjście PrintWriter do pliku. Bez buforowania każde wywołanie metody print () powodowałoby konwertowanie znaków na bajty, które następnie byłyby natychmiast zapisywane do pliku, co może być bardzo nieefektywne.

Rohit Goyal
źródło
0

BufferedWriter - zapisuje tekst w wyjściowym strumieniu znaków, buforując znaki ze strumienia znaków. PrintWriter - drukuje sformatowane reprezentacje obiektów do strumienia wyjściowego tekstu.

Vidyut Singhai
źródło
-1

Myślę, że powód używania PrintWriter jest już wspomniany powyżej, ale jednym z ważnych powodów jest przekazanie obiektu pliku bezpośrednio do konstruktora PrintWriter, co ułatwia jego użycie.

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
AjayLohani
źródło