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?

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 .


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 ...


@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")));

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.


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


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.


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.


-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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.