V této části si povíme o třídě StringBuffer, sloužící k ukládání často měněných řetězců, a následně ještě o konverzích mezi řetězci a dalšími typy.
27.8.2004 12:00 | Petr Hatina | přečteno 55977×
Jak již bylo uvedeno, třída StringBuffer se používá pro ukládání textových řetězců, které budou častěji modifikovány. Pro jejich deklaraci lze použít jeden z těch to způsobů:
StringBuffer strbuf1= new StringBuffer(); //prázdný StringBuffer strbuf2= new StringBuffer("Text");//z prom.typu String StringBuffer strbuf3= new StringBuffer(80);//s kapacitou 80 znaků
Rozšíření řetězce pak provést metodami:
StringBuffer strbuf= new StringBuffer("text"); strbuf.append("text2"); // rozšíří řetězec strbuf.insert(1,"ret"); //vloží text za 2.znak (počítá se od 0)
Metody append a insert nemusí vkládat pouze řetězec, ale i další primitivní typy (např. čísla) nebo pole znaků.
Modifikace obsahu řetězce lze provádět pomocí metod replace(od, do-1 , novýtext) či setCharAt (jen jeden znak).
StringBuffer strbuf= new StringBuffer("stary text"); strbuf.replace(0,5,"novy"); // změní "stary" na "novy" // nutno přičíst k pozici do +1 strbuf.setCharAt(0,'X'); //přepíše znak na pozici 0 Xkem
Obsah řetězce lze i rušit pomocí metod delete(od,do-1), a deleteCharAt(index)), ta zruší jen znak na určené pozici indexu.
StringBuffer strbuf= new StringBuffer("textbezKonec"); strbuf.delete(4,7);//smaž text bez(od poz. 4 do 6+1) strbuf.deleteCharAt(0);
Podobně jako u třídy String lze hledat v řetězci pozici určitého podřetězce metodou indexOf a opačně načíst obsah řetězce od určité pozice metodami substring a charAt.
Při popisu inicializace byla zmíněna kapacita
. Její princip spočívá v tom, že pro uložení znaků v paměti má proměnná typu StringBuffer přiděleny určitý prostor (buffer), když ho překoná, požádá o přidělení dalšího. Aby toto přidělování bylo efektivní,lze předem určit, jaký prostor bude vyžadován, popřípadě ho v programu regulovat těmito metodami:
StringBuffer strbuf1 = new StringBuffer();
int i= strbuf1.capacity(); //aktuální kapacitu
strbuf1.ensureCapacity(99);//zajisti kapacitu 99 znaků
strbuf1.trimToSize(); //zmenši buffer
//aby pokryl jen prostor již obsazený znaky
Samotnou délku řetězce pak můžeme zjistit metodou length() , a změnit jí pomocí setLength(délka). V případě zvětšení je doplněna znaky null ('\u0000').
Verze 1.5 Javy doplňuje novu třídu StringBuilder
, která která je obdobná třídě StringBuffer. Rozdíl je v tom, že původní třída StringBuffer zajišťuje bezpečnou a správnou funkci i při současném běhu více podprocesů v úloze. To nová třída StringBuilder neumožňuje, odměnou je pak uváděna vyšší rychlost zpracování ve většině implementací.
Již v první lekci jsme si ukázali způsob jak provést výstup obsahu proměnné na obrazovku pomocí metody objektu System.out.println
.
Opačný směr, tedy načtení obsahu proměnné z klávesnice lze provést pomocí tříd BufferedReader a InputStreamReader:
String vstup; BufferedReader in; in = new BufferedReader(new InputStreamReader(System.in)); try{ vstup = in.readLine(); } catch(IOException e) {vstup="";}
Jak je z příkladu vidět, byl vytvořen datový tok s vyrovnávací pamětí, přečte řádek ze standardního vstupu. Příkazy catch a try zajištují, v tomto případě povinné ošetření možného vzniku chybového stavu - vyjímky.
I proto, že v minulém odstavci uvedená metoda readLine načítá a vrací pouze textové řetězce, potřebujeme prostředky pro mezi řetězcem a čísly. Celé číselné typy (byte,int,short,long) mají vestavěnou metodu parseXXX. příslušného typu:
String s="777"; int i=Integer.parseInt(s);
Všechny číselné typy pak obsahují metodu valueOf
, která provádí to samé.
String s="1.5"; float f=Float.valueOf(s);
Zpětný převod z čísla na text lze nejlépe provést pomocí metody toString
(která se volá při použití operátoru + imlicitně), nebo metodu valueOf().
for (int i=0;i<5;i++) System.out.println("tohle je "+ (i+1) + ".");
Když již byla zmíněna metoda toString
pro převod čísel na řetězec, je třeba dodat, že metodu toString obsahuje většina tříd v knihovnách Javy a vrací textovou informaci o obsahu objektu. Můžeme jí volat přímo :
System.out.println((new Date().toString()));
Nicméně pokud program zjistí že v prováděné operaci je požadován místo předávaného objektu typ String, použije tuto metodu automaticky. Což se použije například při přiřazení do řetězce, nebo přímo výstupu v objektu out :
Date dat=new Date(); String Pozdrav= "Ahoj, právě je " + dat;//připojení k řetězci System.out.println(dat); // je očekáván řetězec