FileWrite BufferedWriter i PrintWriter połączone

Ok, więc uczę się o I / O, i znalazłem następujący kod w jednym ze slajdów. czy ktoś może wyjaśnić dlaczego istnieje potrzeba posiadania FileWrite, BufferedWriter i PrintWriter? Wiem, że BufferedWriter ma buforować wyjście i umieścić je wszystkie na raz, ale dlaczego mieliby używać FileWriter i PrintWriter ? czy nie robią tego samego z małą różnicą w obsłudze błędów itp?

A także dlaczego przechodzą bw do PrintWriter?

      FileWriter fw = new FileWriter (file);
      BufferedWriter bw = new BufferedWriter (fw);
      PrintWriter outFile = new PrintWriter (bw);
Author: Ahoura Ghotbi, 2013-04-04

6 answers

Prawdopodobnie używają FileWriter, ponieważ chcą zapisać do pliku. Zarówno BufferedWriter, jak i PrintWriter muszą mieć innego pisarza do napisania - potrzebujesz jakiegoś docelowego.

(osobiście nie lubię FileWriter, ponieważ nie pozwala określić kodowania. Wolę używać FileOutputStream owinięte w OutputStreamWriter, ale to inna sprawa.)

BufferedWriter jest używany do buforowania, jak mówisz - chociaż nie buforuje całego wyjścia, tylko stałą jego ilość ( wielkość bufora). Tworzy" chunkier " pisze do autora.

Jeśli chodzi o użycie PrintWriter - cóż, to ujawnia kilka dodatkowych metod, takich jak println. Osobiście nie podoba mi się, ponieważ połyka wyjątki (trzeba sprawdzić wyraźnie z checkError, który nadal nie podaje szczegółów i które nie sądzę, że kiedykolwiek widziałem używane), ale znowu zależy od tego, co robisz. PrintWriter jest przekazywana BufferedWriter jako jej miejsce przeznaczenia.

Więc kod poniżej sekcja, którą pokazałeś, prawdopodobnie będzie zapisywać do PrintWriter, która będzie zapisywać do BufferedWriter, która (gdy jej bufor jest pełny, albo jest spłukany lub zamknięty) będzie zapisywać do FileWriter, która z kolei zamieni dane znaków na bajty na dysku.

 23
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 05:51:41

Z Docs :

Ogólnie rzecz biorąc, pisarz wysyła swoje wyjście natychmiast do podstawowego strumienia znaków lub bajtów. O ile nie jest wymagane wyjście prompt, zaleca się owinięcie BufferedWriter wokół każdego pisarza, którego operacje write() mogą być kosztowne, np. FileWriters i OutputStreamWriters. Na przykład,

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

Buforuje wyjście drukarki do pliku. Bez buforowania każde wywołanie metody print () spowoduje znaki do konwersji na bajty, które następnie zostaną zapisane natychmiast do pliku, co może być bardzo nieefektywne.

Możesz zrozumieć z tego, że {[1] } jest skutecznym sposobem pisania rzeczy.

Zapisuje tekst do strumienia znaków wyjściowych, buforując znaki tak, aby zapewnić wydajny zapis pojedynczych znaków,tablic i łańcuchów.

A FileWriter obiekt jest przekazywany do BufferedWriter, ponieważ intencją jest zapis do jakiegoś pliku wyjściowego za pomocą BufferedWriter.

I wreszcie, PrintWriter jest używany do print* metod, takich jak println().

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 06:14:52

Wydruk z tutaj

Drukuje sformatowane reprezentacje obiektów do strumienia tekstowego. Ta klasa implementuje wszystkie metody print Znalezione w PrintStream. Nie zawiera metod zapisu surowych bajtów, dla których program powinien używać niekodowanych strumieni bajtów.

Z powyższego stwierdzenia wynika, że głównym powodem korzystania z PrintWriter jest uzyskanie dostępu do wszystkich metod PrintStream jak println(),println(char [] x) itd.

BufferedWriter, You jest to jeden z najlepszych sposobów zapisu do pliku, ponieważ buforuje znak w pamięci wirtualnej przed zapisem bezpośrednio do pliku i wymyślił metodę newLine().

FileWriter from here

FileWriter jest przeznaczony do zapisu strumieni znaków. Do pisania strumienie nieprzetworzonych bajtów, rozważ użycie FileOutputStream

.

 2
Author: subodh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 06:44:16

Zazwyczaj ten rodzaj łańcucha pisarskiego dotyczy abstrakcji. PrintWriter posiada kilka przydatnych metod print i println, które mogą być wygodne, jeśli chcesz drukować Ciągi i linie do pliku. Praca bezpośrednio z FileWriter, trzeba by Użyć bardziej" niskiego poziomu " API. I jak mówisz BufferedWriter chodzi o buforowanie. Jest to więc w zasadzie kwestia tego, co chcesz wydrukować do pliku i jaki poziom abstrakcji preferujesz.

 1
Author: NilsH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 05:50:00

FileWriter jest po prostu napisać zwykły tekst (bez formatowania) nie używa żadnego mechanizmu bufora, cokolwiek przychodzi jego sposób po prostu pisze.

BufferedWriter jest opakowaniem dla klas Writer pozwalającym na korzystanie z funkcji bufora (w celu optymalizacji IO).

PrintWriter drukuje sformatowany tekst, możesz podać ciąg formatowania wraz z danymi do wydrukowania, chociaż może on bezpośrednio pracować z dowolnym Writer/OutputStream, tylko w celu zapewnienia buforowania, Writer/OutputStream jest 1st przekazywane do BufferedWriter, a następnie mieć sformatowany tekst jest przekazany do PrintWriter

 1
Author: Ankit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-21 16:29:19

Obiekty są zawijane w tej kolejności, ponieważ chcesz użyć drukarki zewnętrznej do bardziej wyrafinowanego formatowania. BufferedWriter musi być na czymś owinięty. FileWriter jest więc tym, co buforedwriter zawija i jest najbardziej wewnętrznym obiektem.

 0
Author: Richard Wеrеzaк,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 05:56:45