Zeilenumbruch- .txt-Ausgabedatei

damianek2

Mitglied
Hallo,

ich bin komplett neu hier und auch ein Anfänger was das programmieren in Java angeht. Ich bin auf einem TG und in der Schule machen wir gerade die 3-Schichten-Architektur/Vererbung etc. (Nur so mal als Hintergrund)

Ich habe versucht ein Mini-login Fenster zu schreiben - bzw. Registrierung. Man kann auf einen Button klicken "Account erstellen", wann erscheint ein Fenster indem man den Namen und das Passwort eingeben kann. Das soll wiederrum in einer einfachen .txt Datei eingespeichert werden und zwar UNTEREINANDER.
Wenn man ein weiteres mal auf Account erstellen geht, soll die vorhandene Datei überschrieben werden und der neue User unter dem ersten eingetragen werden.

Nun mein eigentliches Problem: Datei wird mit dem ersten Account erstellt - alles cool. Wenn man ein 2tes Account erstellt wird auch dieser zu der Datei hinzugefügt, allerdings hinter dem Vorhandenem, d.h in einer Zeile. Weitere Accounts ebenso. Ich habe versucht mit einfachem "\n" - ging nicht, genauso wie bw.newline funktionierte ebenso nicht. Ich habe auch mit dem PrintWriter versucht "println.()" einzufügen - ist mir leider auch nicht gelungen..und ja sehr wahrscheinlich habe ich was falsch geschrieben...an der falschen Stelle, sonst was.

Mein Quellcode (Ja ich weiss es, sieht sehr wahrscheinlich für Profis sehr schäußlich aus, aber ich fange ja erst an, nimmts mir nicht übel^^):

Java:
String name = txt3.getText();
    String passwort = txt4.getText();
    if (true) {
      try {
        File file = new File("E:/Users/Damian/Desktop/User.txt");
        
        if (!file.exists()) {
          file.createNewFile();
          FileReader fr = new FileReader(file);
          BufferedReader br = new BufferedReader(fr);
          
          String content = (name+" "+passwort+"\n"); 
          //javax.swing.JOptionPane.showMessageDialog(this,"Der Name existiert bereits!");
          
          FileWriter fw = new FileWriter(file.getAbsoluteFile());
          BufferedWriter bw = new BufferedWriter(fw);
          bw.write(content);
          bw.close();
          br.close();
          javax.swing.JOptionPane.showMessageDialog(this,"Account erfolgreich erstellt!"+"\n"+"Name: "+name+"\n"+"Passwort: "+passwort); 
        } else {
          FileReader fr = new FileReader(file);
          BufferedReader br = new BufferedReader(fr);
          
          String content2;
          String content = (name+" "+passwort); 
          //Solange zeile für zeile die Datei auslesen bis die Datei zu ende ist
          while((content2=br.readLine())!= null){
            content += content2;
          }
          
          FileWriter fw = new FileWriter(file.getAbsoluteFile());
          BufferedWriter bw = new BufferedWriter(fw);
          bw.write(content+content2);
          bw.close();
          br.close();
          javax.swing.JOptionPane.showMessageDialog(this,"Account erfolgreich erstellt!"+"\n"+"Name: "+name+"\n"+"Passwort: "+passwort); 
        }
        
      } catch (IOException e) {
        e.printStackTrace();
      }
    }

Danke schon mal für Antworten!🙂

Ahh bitte beachtet die If drumherum nicht, ist erstmal nur der Ansatz, wird später benötigt, es geht mir nur erstmal darum dass das einfach nur vorerst funktioniert, sodass ich weiter arbeiten kann, später kommts in verschiedene Klassen etc.

Edit2: Wenn ich außerdem ein 2tes Account erstelle, bekomm ich am Ende in der txt Datei "null" :/
 
Zuletzt bearbeitet:
Zeilenumbruch in einer Textdatei unter Windows

Java:
"\n\r"

oder halt, um Betriebssystem unabhängig zu agieren :

Java:
System.getProperty("line.separator");
 
Zuletzt bearbeitet:
Danke für die Antwort🙂

Java:
System.getProperty("line.separator");

Damit habe ich es auch versucht :/
Wo genau muss es hin?
Bzw. ist der Quellcode akzeptabel?^^
 
da wp du vorher dein "\n" hattest... also
etwa so
Java:
System.out.println("erster teil"+System.getProperty("line.separator")+"zweiter teil");
 
Ich kriege es nicht hin zum laufen zu bringen...

btw. kann es sein dass mit der While schleife etwas nicht stimmt?

Edit2:

Habe etwas "rumgespielt" und die "null" wegbekommen - genauso wie ein Zeilenumbruch..ja nur 1.

Java:
else {
          FileReader fr = new FileReader(file);
          BufferedReader br = new BufferedReader(fr);
          
          String content2;
          String content = (name+" "+passwort); 
          //Solange zeile für zeile die Datei auslesen bis die Datei zu ende ist
          while((content2=br.readLine())== null){
            content += content2;
          }
          
          FileWriter fw = new FileWriter(file.getAbsoluteFile());
          BufferedWriter bw = new BufferedWriter(fw);
          bw.write(content+(System.getProperty("line.separator"))+content2);
          bw.close();
          br.close();
          javax.swing.JOptionPane.showMessageDialog(this,"Account erfolgreich erstellt!"+"\n"+"Name: "+name+"\n"+"Passwort: "+passwort); 
        }

Das ist die "else" aus dem Code im ersten Post. Nun aber ist beim Erstellen vom ersten und zweitem Account alles gut:
Code:
Name2 Passwort2
Name1 Passwort1

wenn ich aber weitere Accounts erstelle werden die 2 bereits existierenden ersetzt.

Code:
Name3 Passwort3
Name2 Passwort2

Komme nicht weiter...
 
Zuletzt bearbeitet:
Mach mal folgendes , deklarier und initialisiert mal eine Konstante für den Zeilenumbruch

Java:
final static String LINE_BREAK = System.getProperty("line.separator");"

diesen kannst du dann immer dort einsetzen wo du einen Zeilenumbruch einfügen möchtest

z.B

Java:
System.out.println("Wahnsinn ich bin  " + LINE_BREAK + "ein toller Zeilenumbruch");

[EDIT]
Poste mal den kompletten code, das hört sich an als wenn du nur deine Attribute überschreiben würdest , anstelle neuer Accounts anzulegen.
[/EDIT]
 
Zuletzt bearbeitet:
Poste mal den kompletten code, das hört sich an als wenn du nur deine Attribute überschreiben würdest , anstelle neuer Accounts anzulegen.

Das wird so sein...
Ich habe das Prinzip falsch verstanden...Es war so gedacht das "content" immer das eingegebene Passwort und Name ist. "content2" sollte die volle, eingelesene .txt Datei sein zu der dann eben "content" dazu kommt.

Hier der volle Quellcode:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;


/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 28.01.2014
  * @author 
  */

public class GUI extends JFrame {
  // Anfang Attribute
  private JTextField txt1 = new JTextField();
  private JTextField txt2 = new JTextField();
  private JLabel lbl1 = new JLabel();
  private JLabel lbl2 = new JLabel();
  private JButton btn1 = new JButton();
  private JButton btn2 = new JButton();
  private JTextField txt3 = new JTextField();
  private JTextField txt4 = new JTextField();
  private JLabel lbl3 = new JLabel();
  private JLabel lbl4 = new JLabel();
  private JButton btn3 = new JButton();
  // Ende Attribute
  
  public GUI(String title) { 
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 300; 
    int frameHeight = 355;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten
    
    txt1.setBounds(48, 40, 209, 25);
    cp.add(txt1);
    txt2.setBounds(48, 104, 209, 25);
    cp.add(txt2);
    lbl1.setBounds(48, 8, 211, 25);
    lbl1.setText("Name:");
    lbl1.setHorizontalAlignment(SwingConstants.CENTER);
    cp.add(lbl1);
    lbl2.setBounds(48, 72, 211, 25);
    lbl2.setText("Passwort:");
    lbl2.setHorizontalAlignment(SwingConstants.CENTER);
    cp.add(lbl2);
    btn1.setBounds(48, 136, 209, 25);
    btn1.setText("Login");
    btn1.setMargin(new Insets(2, 2, 2, 2));
    btn1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        btn1_ActionPerformed(evt);
      }
    });
    cp.add(btn1);
    btn2.setBounds(48, 168, 209, 25);
    btn2.setText("Account erstellen");
    btn2.setMargin(new Insets(2, 2, 2, 2));
    btn2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        btn2_ActionPerformed(evt);
      }
    });
    cp.add(btn2);
    txt3.setBounds(144, 224, 113, 25);
    txt3.setVisible(false);
    txt3.setText("Name");
    txt3.setFont(new Font("Dialog", Font.ITALIC, 12));
    cp.add(txt3);
    txt4.setBounds(144, 256, 113, 25);
    txt4.setVisible(false);
    txt4.setText("Passwort");
    txt4.setFont(new Font("Dialog", Font.ITALIC, 12));
    cp.add(txt4);
    lbl3.setBounds(48, 224, 91, 25);
    lbl3.setText("Name:");
    lbl3.setHorizontalAlignment(SwingConstants.RIGHT);
    lbl3.setVisible(false);
    cp.add(lbl3);
    lbl4.setBounds(48, 256, 91, 25);
    lbl4.setText("Passwort:");
    lbl4.setHorizontalAlignment(SwingConstants.RIGHT);
    lbl4.setVisible(false);
    cp.add(lbl4);
    btn3.setBounds(56, 288, 201, 25);
    btn3.setText("Registrieren");
    btn3.setMargin(new Insets(2, 2, 2, 2));
    btn3.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        btn3_ActionPerformed(evt);
      }
    });
    btn3.setVisible(false);
    cp.add(btn3);
    
    // Ende Komponenten
    
    setVisible(true);
  } // end of public GUI
  
  // Anfang Methoden
  
  
  public void btn1_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  } // end of btn1_ActionPerformed
  
  public void btn2_ActionPerformed(ActionEvent evt) {
    if (lbl3.isVisible()) {
      lbl3.setVisible(false);
      lbl4.setVisible(false);
      txt4.setVisible(false);
      txt3.setVisible(false);
      btn3.setVisible(false);
      btn2.setText("Account erstellen");
    } else {
      lbl3.setVisible(true);
      lbl4.setVisible(true);
      txt4.setVisible(true);
      txt3.setVisible(true);
      btn3.setVisible(true);
      btn2.setText("Schliessen");
    } // end of if
    // TODO hier Quelltext einfügen
  } // end of btn2_ActionPerformed
  
  
  public void btn3_ActionPerformed(ActionEvent evt) {
    String name = txt3.getText();
    String passwort = txt4.getText();
    String content = (name+" "+passwort);
    if (true) {
      try {
        File file = new File("E:/Users/Damian/Desktop/User.txt"); 
        
        if (!file.exists()) {
          file.createNewFile();
          FileReader fr = new FileReader(file);
          BufferedReader br = new BufferedReader(fr);
                    
          //javax.swing.JOptionPane.showMessageDialog(this,"Der Name existiert bereits!");
                    
          FileWriter fw = new FileWriter(file.getAbsoluteFile());
          BufferedWriter bw = new BufferedWriter(fw);
          bw.write(content);
          bw.close();
          br.close();
          javax.swing.JOptionPane.showMessageDialog(this,"Account erfolgreich erstellt!"+"\n"+"Name: "+name+"\n"+"Passwort: "+passwort); 
        } else {
          FileReader fr = new FileReader(file);
          BufferedReader br = new BufferedReader(fr);
          
                    String content2;
          //Solange zeile für zeile die Datei auslesen bis die Datei zu ende ist
          
          while((content2=br.readLine())== null){
            content = content2;
          }
          
                    
          FileWriter fw = new FileWriter(file.getAbsoluteFile());
          BufferedWriter bw = new BufferedWriter(fw);
          bw.write(content+(System.getProperty("line.separator"))+content2);
          bw.close();
          br.close();
          javax.swing.JOptionPane.showMessageDialog(this,"Account erfolgreich erstellt!"+"\n"+"Name: "+name+"\n"+"Passwort: "+passwort); 
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    } 
    
    
    // TODO hier Quelltext einfügen
  } // end of btn3_ActionPerformed
  
  // Ende Methoden
  
  public static void main(String[] args) {
    new GUI("GUI");
  } // end of main
  
} // end of class Login

Ja wie gesagt, läuft noch alles über den Button, da es nur ein Versuch war, es zum Laufen zum Bringen.
 
Mal abgesehen davon das man beim lesen des Codes Augenkrebs durch die Formatierung bekommt , und du alles in die Gui Klasse stopfst, inclusive der Logik ^^

deklarierst du deine Variablen nur Lokal , und nicht als Attribute der Klasse, und auch noch in der actionPerformed() des Buttons.

1. Schreibe eine Klasse für die Accounts die du erstellen willst.
2. Erstelle über den Button der deine Accounts erstellen soll, ein Objekt deiner Account Klasse
3. Schreibe die Daten die dieses Account Objekt beinhaltet in eine Datei (siehe 4.)
4. Schreibe eine Klasse FileHandler o.ä die die Schreib und Lesezugriffe für deine Accounts händelt.


Das wäre ein OO Ansatz 🙂

hier mal ein Kleiner Ansatz wie sowas aussehen könnte

Java:
public class Account{

  private String name;
  private String password; //  <-- das halte ich allerdings für sehr bedenklich :)

public Account(String name, String password){
  this.name = name;
  this.password = password;

}

public String getName(){
  return this.name;
}


}

Sobald der Button geklickt wurde, wird ein neues Account Objekt erstellt, aus den Textfeldern deiner GUI werden die Informationen ( name und passwort) dem Konstruktor ( oder evtlen. Settern ) übergeben, und du Schreibst die Daten dieses Account Objektes, oder das Objekt selbst, in Serialisierter Form in eine (Text) Datei ( was ich hier auch für die bessere Alternative halte ). Ist es das was du vorhast ?
 
Je nachdem was genau du vorhast , könnte man auch eine Klasse User erstellen und eine Klasse Account, so könnte man jedem Account einen User zuweisen oder umgekehrt 😉
 
Also, wie gesagt, ich habe alles in einer Klasse bzw. über den Button laufen lassen, da es eben nur ein Versuch war..ich wollte nur sehen ob meine Grundidee funktioniert😉

So, ich werde nacher oder morgen versuchen alles umzuschrieben, dann poste ich es hier^^
 

Zurück
Oben