Java tokovi za štampu: PrintStream i PrintWriter
U mojoj karijeri, učestalost korišćenja System.out.println() verovatno nije ništa manja od učestalosti korišćenja metode main. System.out vraća upravo tok za štampu PrintStream.
Pored toga, on ima i svog blizanca — PrintWriter. PrintStream je podklasa klase OutputStream, a PrintWriter je podklasa klase Writer, što znači da je jedan bajtovni tok, a drugi karakterni tok.
Tokovi za štampu imaju sledeće osobine:
- Automatska konverzija tipova podataka: tokovi za štampu mogu različite tipove podataka pretvoriti u nizove znakova i poslati ih u zadati izlazni tok.
- Automatsko dodavanje novog reda: tokovi za štampu mogu na kraj izlaznog niza automatski dodati znak za novi red, što olakšava kontrolu formatiranja kada se ispisuje više nizova.
- Izlaz na konzolu ili u fajl: tokovi za štampu mogu slati podatke na konzolu ili u fajl, što je pogodno za otklanjanje grešaka i vođenje logova (iako se u produkcionom okruženju više preporučuje korišćenje Logback-a, ELK-a i sl.).
Najčešće metode klase PrintStream uključuju:
print(): ispisuje tekstualnu reprezentaciju objekta.println(): ispisuje tekstualnu reprezentaciju objekta i na kraj dodaje znak za novi red.printf(): pomoću zadatog formatnog niza i argumenata ispisuje formatirani niz.
Hajde da to isprobamo na jednom primeru.
PrintStream ps = System.out;
ps.println("Chenmo Wang Er");
ps.print("Chen ");
ps.print("mo ");
ps.print("Wang ");
ps.print("Er ");
ps.println();
ps.printf("Ime: %s, godine: %d, ocena: %f", "Chenmo Wang Er", 18, 99.9);U ovom primeru napravili smo objekat PrintStream ps koji ispisuje na konzolu. Pomoću metoda print i println objekta ps ispisali smo nekoliko nizova.
Pomoću metode printf ispisali smo formatirani niz, gde %s, %d i %f predstavljaju formatirani ispis niza znakova, celog broja i broja sa pokretnim zarezom. Vrednosti koje želimo da ispišemo zadali smo listom argumenata razdvojenih zarezima.
Hajde da detaljnije objasnimo metodu printf.
public PrintStream printf(String format, Object... args);Ovde je format formatni niz, a args lista argumenata za ispis. Formatni niz sadrži obične znakove i specifikatore konverzije. Obični znakovi su svi znakovi osim specifikatora konverzije i u ispisu se pojavljuju doslovno. Specifikatori konverzije sastoje se od znaka procenat (%) i jednog ili više znakova, a služe da odrede format i tip podataka koji se ispisuje.
Evo najčešćih specifikatora konverzije u Javi i odgovarajućih formata ispisa:
%s: ispisuje niz znakova.%dili%i: ispisuje decimalni ceo broj.%xili%X: ispisuje heksadecimalni ceo broj;%xdaje mala slova, a%Xvelika slova.%fili%F: ispisuje broj sa pokretnim zarezom.%eili%E: ispisuje broj sa pokretnim zarezom u naučnoj notaciji;%edaje malo slovo e, a%Eveliko slovo E.%gili%G: ispisuje broj sa pokretnim zarezom, automatski birajući format%fili%e/%E.%c: ispisuje jedan znak.%b: ispisuje logičku vrednost (boolean).%h: ispisuje heš-kod (u heksadecimalnom obliku).%n: znak za novi red.
Pored specifikatora konverzije, Java printf metoda podržava i izvesne modifikatore kojima se određuje širina, preciznost i poravnanje ispisa.
- Modifikator širine: brojem se određuje minimalna širina ispisa; ako ispisani podaci nisu dovoljno široki, sa leve ili desne strane se dopunjuje razmacima ili nulama.
- Modifikator preciznosti: tačkom (
.) i brojem određuje se preciznost za broj sa pokretnim zarezom ili niz znakova — za broj određuje broj decimala, a za niz broj ispisanih znakova. - Modifikator poravnanja: znakom minus (
-) ili nulom (0) određuje se način poravnanja — minus znači levo poravnanje, a nula desno poravnanje sa dopunjavanjem nulama.
Evo nekoliko primera:
int num = 123;
System.out.printf("%5d\n", num); // ispisuje " 123"
System.out.printf("%-5d\n", num); // ispisuje "123 "
System.out.printf("%05d\n", num); // ispisuje "00123"
double pi = Math.PI;
System.out.printf("%10.2f\n", pi); // ispisuje " 3.14"
System.out.printf("%-10.4f\n", pi); // ispisuje "3.1416 "
String name = "Chenmo Wang Er";
System.out.printf("%10s\n", name); // minimalna širina 10; ako je niz duži, ne skraćuje se
System.out.printf("%-10s\n", name); // levo poravnanje; mesto do širine se popunjava razmacimaKonkretno:
%5dznači da ceo broj zauzima širinu od 5 znakova; nedostajući prostor sa leve strane se popunjava razmacima.%-5dznači da ceo broj zauzima širinu od 5 znakova; nedostajući prostor sa desne strane se popunjava razmacima.%05dznači da ceo broj zauzima širinu od 5 znakova; nedostajući prostor sa leve strane se popunjava nulama.%10.2fznači da broj sa pokretnim zarezom zauzima širinu od 10 znakova, sa 2 decimalna mesta; nedostajući prostor sa leve strane se popunjava razmacima.%-10.4fznači da broj sa pokretnim zarezom zauzima širinu od 10 znakova, sa 4 decimalna mesta; nedostajući prostor sa desne strane se popunjava razmacima.%10sznači da niz zauzima širinu od 10 znakova; nedostajući prostor sa leve strane se popunjava razmacima.%-10sznači da niz zauzima širinu od 10 znakova; nedostajući prostor sa desne strane se popunjava razmacima.
Zatim, evo primera sa PrintWriter-om:
PrintWriter writer = new PrintWriter(new FileWriter("output.txt"));
writer.println("Chenmo Wang Er");
writer.printf("Njegove godine: %d.\n", 18);
writer.close();Prvo smo napravili objekat klase PrintWriter čiji konstruktor prima objekat klase Writer kao argument. Ovde koristimo FileWriter da napravimo izlazni tok ka fajlu i taj objekat prosleđujemo konstruktoru PrintWriter-a. Zatim metode println i printf PrintWriter-a koristimo da ispišemo dva reda sadržaja, pri čemu printf prihvata formatni niz. Na kraju, metodom close PrintWriter-a zatvaramo izlazni tok.
Možemo i bez kreiranja FileWriter objekta, tako što direktno zadamo ime fajla.
PrintWriter pw = new PrintWriter("output.txt");
pw.println("Chenmo Wang Er");
pw.printf("Njegove godine: %d.\n", 18);
pw.close();U redu, toliko o tokovima za štampu — prilično su jednostavni. Što se tiče pravila za printf, kada zatreba možete pogledati uputstvo ili API dokumentaciju; nije problem ako ne zapamtite sve napamet.
Ako ti se ovaj članak svideo, lajkuj i prati
