[ Webhosting profitux.cz ]
v6ak [ programování, bezpečnost, web, php, java, ... ] (Vít Šesták)
Buzz - v6ak Twitter - v6ak

štítky

Jak na sprintf v Javě

Možná vám v Javě chybí nějaký ekvivalent funkce sprintf z jazyka C nebo PHP. To není problém. Možnosti streamů v Javě sahají až sem a ještě dál. Jen to bude trošku delší. Ale proč si na to nevyrobit funkci?

A teď jsem našel i ten ekvivalent, díky kterému se můžeme vykašlat na streamy!

Proč to dělat jednoduše, když to jde složitě?

Později jsem hledal umístění této stránky v Googlu a tentokrát jsem (narozdíl od minule) vygooglil něco jednoduššího - metodu java.lang.String.format(String, Object...), případně její kamarádku s prostředím (Locale). Zbytek textu můžete použít jako ukázku síly Javových streamů.

Co na to je v Javě?

V Javě existuje na formátování třída java.io.PrintWriter. Ta nám umožňuje formátovat nějaký výstup, včetně java.io.OutputStream. A mezi OutputStreamy patří také java.io.ByteArrayOutputStream, který nám poskytuje nejen metodu toByteArray(), ale také překrývá metodu toString() svou vlastní. To by mělo stačit.

Čeho jsem se bál?

Třída java.io.ByteArrayOutputStream je bytový proud, nikoli znakový. Bál jsem se tedy možností poškození diakritiky apod. Ve chvíli, kdy jsem to používal poprvé, mi to nijak nevadilo, takže jsem to nestudoval. Teď jsem to prostudoval a zjistil jsem:

Příklad

Rozhodl jsem se tedy imlementovat metodu sprintf (bližší té v php - výsledek je vrácen pomocí návratové hodnoty) a udělat k tomu příklad. Metoda sprintf(String, Object...) je ve stejné třídě jako metoda main(String[]), což sice není ideální, ale pro příklad to stačí.

package v6; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import java.io.Console; public class SprintfExp{ public static void main(String[] args){ Console con = System.console(); if( con == null ){ System.out.println("Neni konzole!"); System.exit(1); }; String s = con.readLine(); System.out.println(": "+s); System.out.println(sprintf("* %s", s)); System.out.format("- %s%n", s); } private static String sprintf(String format, Object... args){ ByteArrayOutputStream res = new ByteArrayOutputStream(); // dokumentace: "Closing a ByteArrayOutputStream has no effect." PrintWriter wr = new PrintWriter(res); // AFAIK zavírá jen stream (res), takže taky není potřea zavírat. wr.format(format, args); wr.flush(); return res.toString(); } }
Všimněte si:
Diskuzi ke článku naleznete zde.

Linkování

Líbí se Vám tato stránka? Zalinkujte ji!

Chcete sledovat novinky? Pokud si právě prohlížíte článek a hledáte RSS pro celý web, pak jste trošku jinde. Možná hledáte poslední změny.

Validní HTML 4.01 StrictValidní CSS 2.0Validní hlavní RSS kanálPHP 5Apache
referer: UA:CCBot/2.0 (http://commoncrawl.org/faq/) time:0.82604700 1498484514
web
mail
comment