Datentypen BufferedReader

Chatman

Mitglied
Hallo,

folgendes Problem: Beim Zeichenweisen einlesen einer Datei wird der Inhalt an den JEditorPane korrekt übergeben. Sobald dies Zeilenweise geschieht nicht mehr !

Funktioniert:
*********
Java:
   private void openFile() {
      JFileChooser jfc = new JFileChooser();
      int result = jfc.showOpenDialog(this);
      if(result == JFileChooser.CANCEL_OPTION) return;
      
      try {
         File file = jfc.getSelectedFile();
         BufferedReader br = new BufferedReader(new FileReader(file));
         br.equals(getFont());{    
         
         String s=""; int c=0;
         while((c=br.read())!=-1) s+=(char)c;
         br.close(); 
	      System.out.println (s);
         jep.setText(s); // !!!!!!!!!!!!!!!
         }
         
//Korrekte Ausgabe auf der Konsole + JFrame

Funktioniert nicht bzw. nur der letzte Wert wird übergeben:
********************************************
Java:
  private void openFileold() {
      JFileChooser jfc = new JFileChooser();
      int result = jfc.showOpenDialog(this);
      if(result == JFileChooser.CANCEL_OPTION) return;
      
      try {
         File file = jfc.getSelectedFile();
         BufferedReader br = new BufferedReader(new FileReader(file));
         br.equals(getFont());{

	    	    String strLine;

	    	    while ((strLine = br.readLine()) != null)   
	    	    {
	    	      System.out.println (strLine);
	    	      jep.setText(strLine); // ??????????
	    	      
         }
	    	   br.close();
}

//Nur Korrekte Ausgabe auf der Konsole

Danke für die Hilfe!
 
Zuletzt bearbeitet von einem Moderator:
Njaa mit setText setzt du eben immer nur die akutelle Zeile. Bei deinem obigen Code bastelst du dir den String allerding simmer wieder zusammen (s+=(char)c; ) so dass es dann eben ein gaaaanz langer Text wird. Bei deinem unteren nimmst du einfahc immer nur die aktuelle Zeile und setzt diese.
Benutze einen StringBuilder und append und baue dir auch da den Text zusammen und rufe setText dann erst am Ende auf.
 
Da kann ich gleich eine Frage stellen die mich schon lange beschäftigt.

Wieso sollte man eigentlich StringBuilder benutzen, wenn man die Strings einfach addieren kann.
Geht es mit StringBuilder schneller oder es ist nur ein sauberer Programmierstil?

Danke schon mal.

Gruss
 
Strings sind immutable.
Das heißt im Extremfall: Nehmen wir an du ließt 1 mio Zeichen ein.
Wenn du jedes Zeichen per + anhängst hast du später 1mio Stringketten im Speichern (a, ab, abc, abcd, usw.). Das kostet sehr viel Speicher und der GC muss ziemlich virl aufräumen.
Der StrinbBuilder macht das etwas intelligenter und hält die strings intern in nem char array.

EDIT:
Hier mal noch zwei bildchen vom Heap. (mit 100.000 Operationen)
Stringkonkatenation: (Dauer: 31000ms)
Anhang anzeigen 2019

StringBuilder: (Dauer: 16ms)
Anhang anzeigen 2020

Das ist natürlich schon nen Extremfall wenn man Zeichen für Zeichen den String zusammenbaut, aber sollte trotzdem klar sein welche Methode schneller ist 😉
 
Zuletzt bearbeitet von einem Moderator:
Die Stringkonkatenation ist sogar mit dem StringBuilder implementiert 😉
Also
Code:
String res = string1 + string2
wird intern sowas sein wie:
Java:
String res = (new StringBuilder()).append(string1).append(string2).toString();

Und da liegt auch das Problem, .toString() erzeugt dir in jedem Schleifendurchlauf wo du mit + konkatenierst einen neuen String. Dieser String wird zwar immer wieder in die selbe Variable gelegt, es ist aber immer wieder ein neuer String (weil die nunmal immutable sind).

EDIT:
Zu jedem neuen String im speicher kommt also auch immernoch ein StringBuilder objekt 😀
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben