Wie kann man mit Java per Button Dateien bearbeiten?

Damdavius

Grünschnabel
Hallo liebe Tutroials.de-Community,
ich bin Niels und ich bin neu bei euch, hab aber bis jetzt nur tolles hier gelesen. :)
Bitte entschuldigt wenn ich mein Thema falsch poste oder das Problem auf der Hand liegt, aber auch im Thema Java bin ich ein Neuling. :(
Kurz und schnell meine Idee:
Ich möchte eine Textdatei per Button klick verändern, es gibt 2 Buttons und somit auch 2 Varianten den Text zu bearbeiten.
Ich habe bereits 2 Codes, weiß aber nicht wie ich die beide zusammenführe.

Mein erster Code zum Erstellen des Fensters mit den Buttons:
Code:
public class Fenster extends JFrame
implements ActionListener {

private JButton b1 = new JButton("Case 1");
private JButton b2 = new JButton("Case 2");

public Fenster()
{
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    setLocationRelativeTo(null);
    getContentPane().add(b1);
    getContentPane().add(b2, BorderLayout.SOUTH);
    b1.addActionListener(this);
    b2.addActionListener(this);
    pack();

    setVisible(true);
}

public static void main(String[] args) {
    new Fenster();
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource()==b1){
        b1.setText("Bearbeitet.");
       // Bearbeiten der Textdatei fehlt
    }
    if (e.getSource()==b2){
       b2.setText("Bearbeitet.");
       // Bearbeiten der Textdatei fehlt
    }
}

Mein zweiter Code welcher das Textdokument bearbeitet:
Code:
public static void connectTo() throws IOException {
    String text = "...";
    String dateiName = "....txt";
    FileOutputStream schreibeStrom = new FileOutputStream(dateiName);
    for (int i=0; i < text.length(); i++){
        schreibeStrom.write((byte)text.charAt(i));
    }
    schreibeStrom.close();
    System.out.println("Fertig.");
}

Ich habe bereits versucht die beiden Codes in eine Klasse zu packen, jedoch erhalte ich bei dem Versuch einen Fehler:
"unhandled exception type IOException".
Der Versuch die Methode aus der anderen Klasse heraus auszuführen hat auch nicht geklappt, selber Fehler.
Wenn ich den Fehler behoben habe sollte es kein Problem mehr sein einen unterschiedlichen Text durch eine Variable auszugeben, aber soweit komme ich nicht.

Danke im voraus für eure Hilfe,
Niels.
 

sheel

I love Asm
Hi und WIllkommen bei tutorials.de,

prinzipiell sollte es kein Problem sein, die untere Methode einfach in den oberen Code einzufügen und in actionPerformed dann aufzurufen. IOExceptions haben auch nichts mit der Klassenstrukturierung zu tun ...
wie lautet die gesamte Ausgabe, samt Stacktrace usw.?

Ein anderes Problem, das ich da sehe, ist
Java:
for (int i=0; i < text.length(); i++){
    schreibeStrom.write((byte)text.charAt(i));
}
Java-Strings sind in UTF16 gespeichert. Von jedem 2-Byte-Tupel die Hälfte zu entfernen und so rauszuschreiben macht je nach Text einen kaputten Dateiinhalt (einfach zu probierendes Beispiel: deutsche Umlaute). Und statt die einzelnen char's in ihre 2 Byte zu zerlegen gibt es eine viel einfachere Lösung:
Java:
public static void connectTo() throws IOException {
    String text = "...";
    String dateiName = "....txt";
    BufferedOutputStream schreibeStrom = new BufferedOutputStream(FileOutputStream(dateiName));
    schreibeStrom.write(text);
    schreibeStrom.close();
    System.out.println("Fertig.");
}
 

Damdavius

Grünschnabel
Danke sheel für deine schnelle Hilfe!

Ich habe deinen Tipp übernommen und habe bei der Methode die Variable "text" eingesetzt.
Unsicher war ich mir bei schreibeStrom.write(), hierfür habe ich als int getBytes() eingesetzt, ich hoffe das ist korrekt.

Hier der bearbeitete Code falls nochmal jemand das Problem hat:
Code:
public static void connectTo(String text) throws IOException
   {
    String dateiName = "realmlist.wtf";
    BufferedOutputStream schreibeStrom = new BufferedOutputStream(new FileOutputStream(dateiName));
    schreibeStrom.write(text.getBytes());
    schreibeStrom.close();
    System.out.println("Fertig.");
   }
  
   @Override
public void actionPerformed(ActionEvent e)
   {
     if (e.getSource()==rg)
     {
       rg.setText("Verbinde");
       try
       {
         connectTo("set realmlist logon.rising-gods.de");
       }
       catch (IOException e1)
       {
         e1.printStackTrace();
       }
       System.exit(1);
     }
     if (e.getSource()==ll)
     {
       ll.setText("Verbinde");
       try
       {
         connectTo("set realmlist logon.laenalith-wow.com");
       }
       catch (IOException e1)
       {
         e1.printStackTrace();
       }
       System.exit(1);
     }
   }

Alles funktioniert bis jetzt. ;)
Grüße,
Niels.
 
Zuletzt bearbeitet:

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

das getBytes() verwendet das System-Standard-Encoding. Also unter Windows das CP-1511 (glaub ich, so was wie ISO-8859) und unter Linux UTF-8.
Je nachdem was du willst würde ich aber das Encoding fix mitgeben.
Also entweder getBytes(Charset.forName("UTF-8")) oder (bevorzugt) getBytes(StandardCharsets.UTF_8).

Grüsse,
BK
 

Damdavius

Grünschnabel
Hallo,

ich bins nochmal.
Habe noch eine weitere Frage:
Wie kann ich einstellen, dass die Datei "....txt" jedes mal überschrieben wird ?

Danke im voraus für eure Hilfe,
Niels.
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

wieso nicht mit delete()?

Ich verstehe aber gerade eine Frage nicht so ganz. Du willst die Datei immer komplett von 0 aus schreiben? Dann verwende den anderen Konstruktor des FileOutputStreams, bzw. standardmässig wird die Datei eh überschrieben.

Grüsse,
BK
 

Damdavius

Grünschnabel
Hey!

Ich möchte eine Datei bearbeiten, in der sich eine IP zum Verbinden auf einen Server befindet.
In dieser Datei darf nur die eine IP stehen, weshalb ich sie immer überschreiben muss.
Wie du schon richtig sagst überschreibt die Methode standartmäßig eh, ist mir jedoch nicht aufgefallen da die .jar keine Rechte hatte.
Das sollte also kein Problem mehr darstellen.
Bis hierher erstmal ein riesen Danke an alle die mir geholfen haben das Ding zum laufen zu bringen!! :)

Leider habe ich ein neues Problem.
Ich habe dem Programm noch einen JFileChooser hinzugefügt, welcher den vom Benutzer ausgewählten Pfad in der Variable path speichert.
Code:
public static void choose()
   {
     JButton open = new JButton();
     JFileChooser fc = new JFileChooser();
     fc.setCurrentDirectory(new java.io.File("C:/Program Files"));
     fc.setDialogTitle("Wähle deine Realmlist");
     fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
     if (fc.showOpenDialog(open) == JFileChooser.APPROVE_OPTION)
     {
            System.out.println("Erfolgreich!");
     }
     path = fc.getSelectedFile().getAbsolutePath();
   }

Sobald ich diese Varibale jedoch verwende, um die Datei zu erstellen / überschreiben, erhalte ich den Error "Das System kann die angegebene Datei nicht finden".
Code:
    String dateiName = "Path/x.txt";

Danke für alle die mir noch Helfen. :x
Grüße,
Niels.