# Nur JavaBeans laden? Dateifilter?



## Luma (17. Sep 2005)

Hio. Ich bin gerade an einem Java-Programm welches meinen Roboter steuern soll. Da ich meinen Roboter ständig verändere will ich das Programm sehr modular programmieren. 
Ich habe das dann so vorgesehen: Das Hauptprogramm besteht aus mehreren Desktops (also JDesktopPanes) die auswählbar sind. Auf diesen Desktops sollen später einmal meine Module geladen und angezeigt werden. Mit Modulen bezeichne ich kleine eigenständige Programme (als JavaBean verpackt und mit einem JInternaleFrame auf dem jeweiligen Desktop angezeigt) mit welchem man unterschiedliche Funktion des Roboters ansteuern kann (also z. B. das Modul CameraModule. Mit ihm kann man die Kamera des Roboters auslesen).
Wie bereits erwähnt verpacke ich diese Module in Beanform als eine Jar. Später gibt es dann ein großes Sammelverzeichnis wo man alle diese Module ablegt. Wenn dann das Java-Programm startet lädt es diese Module.

Jetzt das Problem: Wenn ich zu NetBeans die Bean hinzufüge und die in einem JInternaleFrame anzeige geht das wunderbar. D. h. er liest die Bean aus und zeigt sie in einem JInternaleFrame an. Nur soll das Programm später "alleine" die Beans hinzufügen. Wie geht das? Wie lese ich ein Verzeichnis aus. Sammle alle vorhandene Dateinamen und laden dann Bean für Bean auf den Desktop?
Bisher kann ich das ganze nur mit einer Notlösung realisieren. Und zwar lege ich im ext-Verzeichnis des JRE die Bean ab. Dann kann ichs im Programm öfnen. Aber so ist das nicht sonderlich schön. Hat mir da jemand vielleicht eine bessere Lösung?
Danke im Vorraus,
Lutz


----------



## L-ectron-X (17. Sep 2005)

Willst du die Dateien aus dem Verzeichnis mit einem JFileChooser noch auswählen können, oder sollen sofort alle vorhandenen Dateien eingelesen werden?


----------



## Luma (17. Sep 2005)

Alle Dateien sollen eingelesen werden und dann mit einem JInternaleFrame auf einem JDesktopPane angezeigt werden...


----------



## L-ectron-X (17. Sep 2005)

Fangen wir doch mal damit an:


			
				Luma hat gesagt.:
			
		

> ...
> Wie lese ich ein Verzeichnis aus. Sammle alle vorhandene Dateinamen
> ...


Ich habe das mal ausprobiert und eine Klasse gekritzelt, die mit Hilfe eines Dateifilters ein vorzugebendes Verzeichnis nach Dateien des Typs .jar durchsucht und die gefundenen Dateien für die weitere Bearbeitung/Verwendung zurückgeben kann.

```
import java.io.File;
import java.io.FilenameFilter;
import java.util.Vector;

/**
* Diese Klasse gibt alle Dateien der spezifizierten Directory und optional
* des spezifizierten Typs zur weiteren Bearbeitung/Verwendung zurück.
*/
public class ReadAllFilesInDirectory {
   private File filedir;
   private File[] filteredFiles;

   /**
   * Dieser Konstruktor dient dazu, ein Objekt der Klasse so zu initialisieren,
   * dass nur Dateien des spezifizierten Verzeichnisses und des spezifizierten
   * Dateityps verarbeitet werden können.
   * @param dir Die Directory, in der nach Dateien eines Typs gesucht werden soll.
   * @param suffix Dateien dieses Dateityps sollen gesucht werden.
   */
   public ReadAllFilesInDirectory(String filedir, String suffix) {
      this.filedir = new File(filedir);
      filteredFiles = listFiles(suffix);
   }

   /**
   * Dieser Konstruktor dient dazu, ein Objekt der Klasse so zu initialisieren,
   * dass alle Dateien des spezifizierten Verzeichnisses verarbeitet werden können.
   * @param dir Die Directory, deren Inhalt ausgegeben werden soll.
   */
   public ReadAllFilesInDirectory(String filedir) {
      this.filedir = new File(filedir);
      filteredFiles = this.filedir.listFiles();
   }

   //Erstellt die Liste von Dateien einer Directory
   private File[] listFiles(String suffix) {
      Filter f = new Filter(suffix);
      Vector list = convertToVector(filedir.listFiles());
      for(int i = 0, j = list.size(); i < j; i++) {
         //Datei entspricht nicht dem gesuchten Muster
         if(!f.accept(((File)list.get(i)).getParentFile(), ((File)list.get(i)).getName())) {
            list.remove(i);
            i--;
            j--;
         }
      }
      return convertToArray(list);
   }

   /**
   * Gibt ein File-Array zurück, in welchem die ermittelten Dateien des
   * spezifizierten Typs gespeichert sind.
   * @return ein File-Array
   */
   public File[] getFilteredFiles() {
      return filteredFiles;
   }

   //Hilfsmethode zum Umwandeln eines Arrays in einen Vector
   private Vector convertToVector(Object[] obj) {
      Vector v = new Vector(obj.length);
      for(int i = 0; i < obj.length; i++) {
         v.add(obj[i]);
      }
      return v;
   }

   //Hilfsmethode zum Umwandeln eines Vectors in ein Array
   private File[] convertToArray(Vector vec) {
      File[] files = new File[vec.size()];
      for(int i = 0, j = vec.size(); i < j; i++) {
         files[i] = (File)vec.get(i);
      }
      return files;
   }

   /**Ein Dateifilter für beliebige Dateitypen.
   * Der gesuchte Dateityp wird dem Konstruktor der Klasse übergeben.
   */
   class Filter implements FilenameFilter {
      private String suffix;

      /** Konstruktor. Er erwartet einen String, der den Dateityp spezifiziert.
      * @param suffix Die Dateiendung. Bsp.: .txt
      */
      public Filter(String suffix) {
         this.suffix = suffix;
      }

      public boolean accept(File dir, String name) {
         return dir.equals(filedir) && name.endsWith(suffix);
      }
   }

   //Eine Methode zum Testen der Klasse
   public static void main(String[] args) {
      ReadAllFilesInDirectory rafid = new ReadAllFilesInDirectory("C:/Pfad/zu/den/JavaBeans", ".jar");
      File[] files = rafid.getFilteredFiles();
      for(int i = 0; i < files.length; i++) {
         System.out.println(files[i]);
      }
   }
}
```
Ich hoffe, du kannst sie gebrauchen oder dir geht das eine oder andere Licht auf.  :wink:
Es kann sein, dass sie nicht perfekt ist, aber sie funktioniert.


----------



## Luma (18. Sep 2005)

Auf jedenfall mal großen Dank!


----------

