Operation StringBuffer

julia123

Erfahrenes Mitglied
hi ,

ich versuche dieses objekt zu verstehen hab mir die beschriebung des StringBuffer durch gelesen bin leider nicht viel schlauer geworden. was kann das ding und was hat es genau mit dieser appends funktion zu tun.
Code:
StringBuffer sb = new StringBuffer();
For example, if z refers to a string buffer object whose current contents are "start", then the method call z.append("le") would cause the string buffer to contain "startle",

ok was meint man in der zeile :
if z refers to a string buffer object whose current contents are "start"
genau so wie der teil
then the method call z.append("le") would cause the string buffer to contain "startle"
alos eigentlich alles^^?
ich kenne sowas wie den BufferReader.- haben die beiden änlichkeiten oder was miteinander?
 

ComFreek

Mod | @comfreek
Moderator
ich kenne sowas wie den BufferReader.- haben die beiden änlichkeiten oder was miteinander?
Nein, nicht wirklich.

Der Stringbuffer ist im Prinzip ein riesiger String, wo du einfach Strings hinzufügen kannst.
Der Unterschied zu einem normalen String ist, dass StringBuffer effizienter arbeitet.

Meine Übersetzung:
Wenn z zu einem StringBuffer Objekt zeigt, dessen aktueller Inhalt "start" ist, dann würde der Aufruf z.append("le") dazu führen, dass später der Buffer "startle" enthält.
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

Strings selbst sind in Java "immutable", das heißt du kannst diese nicht verändern.
Du kennst vielleicht folgendes Konstrukt:
Java:
String test = "hallo";

test = test + " welt";
test = test + "!";

Was passiert nun bei diesen beiden Zeilen?
- In Zeile 1 wird ein neuer String mit dem Wert "hallo" erstellt.
- In Zeile 3 wird der alte Wert "hallo" genommen, und " welt" hinten dran gehängt.
- Das Ergebnis, "hallo welt", ist ein neuer String, welcher in der Variablen gespeichert wird.
- Analog dazu Zeile 4, hier wird wieder ein neuer String erstellt.

Man nehme also das Schnipsel oben, und setze es in eine Schleife, zum Beispiel so:
Java:
String test = "1";

for(int i = 2; i < 10; i++) {
  test = test + " " + i;
}

In diesem kurzem Abschnitt werden insgesamt 10 Instanzen von String gebiltet, für jede neue Zahl die hinten dran gehängt wird, eine neue. Das ist natürlich extrem ineffizient, da immer wieder ein neuer String erstellt wird. Je nachdem, wieviel Daten du in dem String speicherst und wie oft du die Schleife durchgehst, desto länger dauert der Vorgang.

Hier kommen dann StringBuilder und StringBuffer ins Spiel. Diese verwenden intern als ein Array aus Buchstaben (char[]), welches bei Bedarf halt vergrößert wird. Das vergrößern des Arrays und anschließende Speichern der neuen Buchstaben da drin geht viel schneller und braucht weniger Speicher als das neue Instanzieren eines Strings.

Dann noch kurz zu dem Unterschied zwischen StringBuffer und StringBuilder. *Builder ist nicht synchronized, das heißt, dass bei der Verwendung von mehreren Threads nicht sicher gestellt ist, dass die Daten auch komplett und richtig hinten dran gehängt werden. Für diesen Fall gibt es dann StringBuffer.

Abschließend noch ein paar Worte zum BufferedReader. Das lesen einer Datei funktioniert im Grunde durch das Byte-für-Byte laden der einzelnen Bytes. Eine reine Textdatei zu lesen wäre somit etwas umständlich, vorallem weil man das ja relativ häufig muss. Für diesen Fall gibt es unter Anderem den BufferedReader. Dieser ist vorallem für das Zeilenweise lesen von Textdateien gedacht, durch die readLine() Methode ist das sehr einfach. Mit dme StringBuilder und StringBuffer hat er somit eigentlich nichts zu tun.

Grüße,
BK
 
Zuletzt bearbeitet:

julia123

Erfahrenes Mitglied
ich hab jetzt hier sowas:

Code:
FileHandling f;
		f = new DateiLenkung(file);
		StringBuffer sb = new StringBuffer();// was macht dieser StringBuffer
		for (String line : f.gTextinhalt()) {//f.gTextinhalt() = eine liste von Textzeilen
			 sb.append(line);// dass versteh ich nicht ganz,// die kombination von sb und append ist gkaube ich das problem
			 sb.append(System.lineSeparator());// was bedeutet das System.lineSeparator()
		}
*Im Kommentar sind meine Fragen.
 

ComFreek

Mod | @comfreek
Moderator
// was macht dieser StringBuffer
Wie meinst du das? Da wird ein neuer erstellt. Falls du 'new' nicht kennst, dann schau (am Besten: lies) dir bitte ein Java-Tutorial an.

was bedeutet das System.lineSeparator()
Möglichkeit a): Sich den Sinn über den Namen herleiten
Möglichkeit b): Die Java-Dokumentation aufschlagen

sb.append(line);// dass versteh ich nicht ganz,// die kombination von sb und append ist gkaube ich das problem
Was für ein Problem?
Was verstehst du nicht? Du weißt, was .append() macht? Wenn nicht, schlag die Java-Dokumentation auf.

Ich weiß, ich bin hier nicht so geduldig und ausdauernd wie manch anderer hier (Bratkartoffel). Dies hat auch einen Sinn dahinter:

Man sollte lernen, sich selbst über Funktionsweisen von Methoden oder Klassen zu informieren.
Man sollte lernen, selbst im Internet mal zu suchen.

Das sind nur zwei Aspekte von vielen, die einen Programmierer ausmachen. Wenn man jemals fortgeschrittene Themen angreifen möchte, dass muss man diese Techniken inne haben, das kannst du mir getrost glauben ;)
 

julia123

Erfahrenes Mitglied
es ging mir eigentlich um die funktionalität... bei // was macht dieser StringBuffer. egal
System.lineSeparator() -> trennung von zeilen
sb.append -> append(hanängen) -> also wird jede zeile der "Text" in den sb angehängt. richtig?
ich kann mir das weill nicht so richtig vorstellen wie die Zeilen im StringBuffer liegen. angenommen ich hab diesen text :
Hallo ich bin
neu
wie geht es euch?

wie könnt ich jetzt nur die zeile neu ansprechen? das ist ja alles im StringBuffer gespeichert als Array oder ?
 

Cromon

Erfahrenes Mitglied
Der Stringbuffer arbeitet nicht mit Zeilen, der Stringbuffer hat einfach einen Text in sich. Du kannst daher auch nicht Zeilen davon ansprechen. Das ist ein langer String, kein Array.
 

sheel

I love Asm
@julia: Nein. Das ist nicht der Sinn von StringBuffer.
Was du meinst ist zB. eine ArrayList, das hier ist aber was Anderes.
->Doku.
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi julia,

bitte achte wieder mehr auf die Netiquette, vorallem die Groß- und Kleinschreibung.

[...]angenommen ich hab diesen text :
Hallo ich bin
neu
wie geht es euch?

wie könnt ich jetzt nur die zeile neu ansprechen? das ist ja alles im StringBuffer gespeichert als Array oder?

direkt kannst du das "neu" nicht ansprechen, oder besser gesgt nicht leichter als das "my" in dem String "hello my world". Von der Herleitung hast du das eh schon richtig, mit dem append() hängst du einfach hinten noch etwas dran.

ich kann mir das weill nicht so richtig vorstellen wie die Zeilen im StringBuffer liegen.
Wie es intern im StringBuffer gespeichert wird ist für dich nicht relevant. Wichtig ist primär die toString() Methode, mit der du den kompletten Inhalt des Buffers als einen String bekommst.

Aber:
Da es bei deinen Fragen hier vorallem um grundsätzliche Themen der Java Programmierung geht würde ich dir ein Buch (zum Beispiel Java ist auch eine Insel) empfehlen. Dort lernst du kostenlos alles wichtige um das Java-Programmieren, teils auch besser erklärt als wir es hier können. Deshalb entschuldige bitte, wenn ich mich jetzt aus dem Thread zurückziehe, aber ich (wir / tutorials.de ?) sind keine Lehrer, die dir das alles Schritt für Schritt erklären. Wir sind hauptsächlich hier um bei konkreten Problemen zu helfen sowie Lösungsvorschläge oder Verbesserungsideen zu diskutieren.

Grüße,
BK
 
Zuletzt bearbeitet:

julia123

Erfahrenes Mitglied
ok vielen dank erst mal. Ich fass mal zusammen.
ich weiss das man aus büchern viels gut erklärt ist aber ich hab manchmal echt probleme so sachen zu verstehen und bruach dann jemanden der direkt auf meine Fragen eingeht. Ich bin euch wirklich dankbar dafür!

Code:
FileHandling f;
        f = new DateiLenkung(file);
        StringBuffer sb = new StringBuffer();// eine speicher für Strings 
        for (String line : f.gTextinhalt()) {// zeile für zeile wird übergegeben
             sb.append(line);//*
             sb.append(System.lineSeparator());//*
        }
Bsp. Text :
Hallo ich bin
neu,
wie geht es euch?

so leigt der Text in der Liste vor:
An der 0 Stelle der Liste steht "Hallo ich bin", 1 Stelle "neu," , 2 Stelle "wie geht es euch?".
Jetzt wird ja immer pro stelle eine line erstelt(pro Zeile) und angehanen.

Angenomen ich hab ein String der heißt text also so was und in diesem wurde die obere Funktion gespeichert dann würde das so aussehen:
Code:
Sting text = "Hallo ich bin"+"/n"+"neu"+"/n"
 

Neue Beiträge