Martin Jung: FileChooser und grosse Datenmengen

Beitrag lesen

Hi,

public boolean accept(File f){
  if(f.isDirectory()){
    return true;
  }
  else{
    boolean erlaubt=false;
    String name=f.toString();
    name=name.subString(name.indexOf("."));
    for(int i=0; i<=extension.length-1; i++){
      if(name.indexOf(extension[i]!=-1){
        erlaubt=true;
        i=extension.length;
      }
      else erlaubt =false;
    }
    if(erlaubt==true) return true;
    else return false;
  }
}

Gibt es da Optimierungsmöglichkeiten?

Ja.

1. Die einfachste und daher sinnvollste:
Speichere in besagtem Verzeichnis einfach nur Image-Dateien, und zwar auschließlich diese, die der FileChooser auch anzeigen darf. Dann müsstest Du höchstens das Verzeichnis auf Gültigkeit prüfen (dessen Pfad/Namen man ja extern konfigurierbar machen kann). accept() könnte dann folgendermaßen aussehen:

public boolean accept(File f){
   if(f.isDirectory()){
      // Pseudo-Code
      if(DirectoryIsCorrekt()) {
        return true;
      }
   }
   return false;
 }

Andere Optimierungen im else-Zweig, wenn obiges nicht realisierbar ist:

2. Extension-Abfrage:
Speichere die Extensions im Array zusammen mit dem Prefix-Dot (".gif" etc.), dann kannst Du Dir die Generation eines String-Objekts sparen. Desweiteren gibt es noch einige nicht notwendige Statements, die zur Laufzeit aber ausgeführt werden und daher Zeit in Anspruch nehmen. accept() könnte dann folgendermaßen aussehen:

public boolean accept(File f){
   if(f.isDirectory()){
     return true;
   }
   else{
     String name=f.getPath();   // siehe 3.
     for(int i=0; i<=extension.length-1; i++) {
       if(name.indexOf(extension[i]!=-1){
          // Achtung: diese if-Abfrage würde auch folgendes durchgehen lassen:
          // <testdocument.gif.txt>
          // ganz sicher ist man mit <name.endsWith(extension[i])>
         return true;   // durch die return-Anweisung 'verlässt'
                        // Du an dieser Stelle die Methode und
                        // implizit die Schleife ;-)

// weitere Anmerkung
         // i=extension.length;
         // was bezweckst Du mit letztem Statement eigentlich?
         // Das, was Du hier anscheindend möchstest, erreicht man
         // - wenn notwendig (dies ist hier nicht der Fall!) - verständlicher mit <break;>
       }
     }
     return false;
   }
 }

3. String name = f.getPath(); // String name=f.toString();
Im Archiv findest Du einen Thread (genauer: http://forum.de.selfhtml.org/archiv/2003/1/35197/#m192657, indem herausgearbeitet wurde, das die Verwendung von .toString() u.U. langsamer sein kann als die der 'direkten' Get-Methoden. In der Summe kann sich das aber bereits bemerkbar machen (oder eben auch nicht, ich habe das nur der Vollständigkeit halber hier erwähnt).

Übrigens: ich habe den Code nicht durch Testen geprüft ;-)

Viele Grüße,
Martin Jung