Zum Inhalt springen

xml ändern und direkt neu einlesen


schnixx

Empfohlene Beiträge

Hallo zusammen,

ich habe ein Tool geschrieben, welches eine xml-Datei auswertet und deren Inhalt darstellt.

Nun möchte ich noch einen Button integrieren, anhand dessen es möglich ist, die xml-Datei aufzurufen und zu verändern. Das ganze soll im Notepad++ geschehen.

Mein Problem ist nun, dass ich nicht weiß, wie die veränderte xml-Datei nach dem abspeichern direkt wieder neu vom Tool eingelesen wird, ohne das ich das Tool Neustarte

(XML Datei verändern, speichern, schließen-> Tool besitzt sofort den neuen Inhalt)

Habt Ihr Ideen, gibt es Lösungsvorschläge?

Danke!


		JButton confButton = new JButton("Configure XML");

		confButton.setEnabled(true);


		confButton.setToolTipText("Click this button to configure the xml-file");



		confButton.addActionListener(new ActionListener() {


			public void actionPerformed(ActionEvent arg0)

			{

				String z;

				System.out.println("Button Configure XML betätigt!");


				File xml = new File ("config.xml");

				try {

					Runtime.getRuntime().exec("C:\\Program Files (x86)\\Notepad++\\notepad++.exe \"" + xml.getAbsolutePath() + "\"");


				} catch (IOException e) {

					// TODO Auto-generated catch block

					JOptionPane.showMessageDialog(null,"Cannot open sourcefile","ERROR", JOptionPane.ERROR_MESSAGE);

					e.printStackTrace();

				}



			}



		});

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du die Datei mit einem externen Programm bearbeitest, wirst du wohl nicht drum rum kommen, das XML-File zu beobachten und bei einer Änderung dein Hauptprogramm zu benachrichtigen.

Mit dem Button, der auch Notepad++ startet, könntest du z.B. einen Listener starten, der die Datei mit normalen Boardmitteln überwacht (also das File auf Veränderung prüfen). Die Hauptanwendung ist dabei dann der Observer (siehe auch Observer-Pattern). Bei einer Änderung der Datei wird das Hauptprogramm aufgerufen und der Datei-Listener gleichzeitig wieder gelöscht....

naja so in etwa halt :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du weißt wie die Datei heißt könntest du über myFile.lastModified das Datum der letzten Änderung abfragen.

Lass doch einen Thread laufen der regelmäßig prüft, ob die Datei geändert wurde und ggf. diese neu einließt.

Andere Möglichkeit:

Runtime.getRuntime().exe(...) liefert dir ein Process-Objekt zurück. Von diesem könntest du dir den InputStream holen und versuchen zu lesen (da kommt wahrscheinlich nichts drüber rein, ist aber auch egal), denn sobald Notepad++ wieder geschlossen wird solltest du eine IOException bekommen oder anderweitig einen Fehler. Sobald der auftritt weißt du dann: Ok... Notepad++ geschlossen => datei neu laden.

Bearbeitet von speedi
Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Datei muss ja manuell verändert werden. Der Benutzer verändert die Datei und das Tool liest die Datei neu aus und erstellt anhand der veränderten xml Datei das Tool neu.

Mein derzeitiges Problem liegt vor allem daran, dass die neu eingelesenen Werte an die alten angehängt werden. Dabei sollen die alten Werte eigl. nicht mehr vorhanden sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja, das kommt dann ganz darauf an, wie du die XML-Datei darstellst.

GRundsätzlich sollte der Ablauf ja so sein:

In der Java-Application Button drücken -> Notepad++ startet -> Listener, der die Datei überwacht, registrieren -> Java-Application hängt sich als Observer an den Listener -> Notepad++ speichert datei -> Listener benachrichtigt den Observer, dass die Datei geändert wurde -> der Observer, also die Java-Application, kümmert sich darum, dass die alte Darstellung des XML-Files gelöscht wird -> neues XML-File wird gelesen und angezeigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

leider habe ich noch nicht mit listener und observer gearbeitet.

besteht keine andere möglichkeit?

könnte das ganze auch über 2 button realisieren(configure, refresh).

Das ist eigentlich nicht so schwer. Zum einen startest du einen Thread (z.B. class MyFileObserver) der in regelmäßigen abständen schaut ob sich der Timestamp der Datei geändert hat. In dieser Klasse, welche die Datei überwacht gibt es dann eine Liste mit ChangeListenern (entsprechende addChangeListener und removeChangeListener- Methoden müsstest du dann natürlich auch implementieren. Wenn sich dann der Timestamp der Datei ändert iterierst du über die Liste und rufst von jedem Changelistener die stateChanged-methode mit einem ChangeEvent dem du als Source das File-Objekt übergibst.

Letztendlich kannst das Event dann in etwa so Abfangen:


MyFileObserver fileObserver = new MyFileObserver(file);

fileObserver.addChangeListener(new ChangeListener(){

  @Override  

  public void stateChanged(ChangeEvent event){

    // potentiell unsicher durch fehlenden TypeCheck

    File f = (File)event.getSource();


    // Neu laden der Datei

    load(f);

  }

});

Der FileObserver könnte in etwa so aussehen:
import java.io.File;

import java.util.LinkedList;

import java.util.List;


import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;


public class FileObserver extends Thread {

  private File                 mFile;

  private boolean              mRunning         = true;

  private long                 mTimeStamp;

  private List<ChangeListener> mChangeListeners = new LinkedList<>();


  public FileObserver(File file) {

    super(FileObserver.class.getCanonicalName() + ": " + file.getAbsolutePath());


    this.mFile = file;

    this.mTimeStamp = file.lastModified();


    start();

  }


  public void addChangeListener(ChangeListener listener) {

    synchronized (mChangeListeners) {

      mChangeListeners.add(listener);

    }

  }


  public void removeChangeListener(ChangeListener listener) {

    synchronized (mChangeListeners) {

      mChangeListeners.add(listener);

    }

  }


  public void stopObserving() {

    mRunning = false;

    interrupt();

  }


  @Override

  public void run() {

    while (mRunning) {

      long timeStamp = mFile.lastModified();


      if (timeStamp != this.mTimeStamp) {

        notifyFileChanged();


        mTimeStamp = timeStamp;

      }


      try {

        Thread.sleep(1000);

      } catch (InterruptedException e) {}

    }

  }


  private void notifyFileChanged() {

    ChangeEvent changeEvent = new ChangeEvent(mFile);


    synchronized (mChangeListeners) {

      for (ChangeListener changeListener : mChangeListeners) {

        try {

          changeListener.stateChanged(changeEvent);

        } catch (Throwable e) {

          e.printStackTrace();

        }

      }

    }

  }

}

Hinweis: Der Thread im beispiel läuft solang weiter bis du durch aufrufen der Methode stopObserving() den Spaß beendest. Tust du das nicht verschwendest du ressourcen. Du kannst es auch so machen, dass die Schleife unterbrochen wird, sobald sich die Datei geändert hat. Aber so hätte es den Vorteil, dass der Benutzer mit Nodepad++ auch 1000x speichern kann und du lädst immer automatisch neu.

Bearbeitet von speedi
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...