2009-06-10 8 views
0

J'écris une classe Java qui analyse les fichiers journaux. Le fichier .class compilé doit être chargé dans une plate-forme de surveillance tierce (eG) pour le déploiement et l'invocation. Malheureusement, la plate-forme tierce me permet seulement de télécharger un seul fichier .class. Mon implémentation actuelle a pour fonction de trouver le 'dernier fichier' dans un dossier conforme à un masque de fichier (* CJL * .log) et utilise 2 classes anonymes, une pour filtrer une liste de répertoires et une autre pour trier un liste de fichiers basée sur ModifiedDt. Quand je compile cela, j'obtiens 3 fichiers .class (Monitor.class, Monitor $ 1.class, Monitor $ 2.class) que je ne peux pas déployer.Puis-je compiler des classes anonymes ou internes dans un seul fichier java .class?

Est-il possible de compiler les classes anonymes dans un seul fichier .class pour le déploiement sur la plate-forme de surveillance tierce?

J'ai joint le code de ma fonction 'Find Lastest file' pour illustration.

private String FindLatestFile(String folderPath) { 
    FilenameFilter filter = new FilenameFilter() { 
     public boolean accept(File dir, String name) { 
      if (name.endsWith(".log") 
        & name.contains("CJL")) 
       return true; 
      else 
       return false; 
     } 
    }; 

    File dir = new File(folderPath); 

    File[] files = dir.listFiles(filter); 

    if (files.length > 0) { 
     Arrays.sort(files, new Comparator<File>() { 
      public int compare(File f1, File f2) { 
       return Long.valueOf(f1.lastModified()).compareTo(
         f2.lastModified()); 
      } 
     }); 

     File newest = files[files.length - 1]; 

     return newest.toString; 
    } else { 
     return ""; 
    } 
} 

Je suppose qu'il est possible de le faire de la manière « stupide » en obtenant un fichier brut liste et de faire le filtre/tri moi-même mais je suis inquiet ce ne sera pas performant.

Des idées?

Michael

Répondre

4

Ce n'est pas possible. Je suppose qu'un pot ne peut pas non plus être utilisé.

Une solution de contournement serait que la classe implémente les deux interfaces pour supprimer le besoin de classes internes.

class MyClass implements FilenameFilter, Comparator<File> { 
    ... 

    public boolean accept(File dir, String name) { 
     if (name.endsWith(".log") & name.contains("CJL")) 
       return true; 
     else 
       return false; 
    } 

    public int compare(File f1, File f2) { 
     return Long.valueOf(f1.lastModified()).compareTo(
       f2.lastModified()); 
    } 

    private String FindLatestFile(String folderPath) { 

     File dir = new File(folderPath); 

     File[] files = dir.listFiles(this); 

     if (files.length > 0) { 
      Arrays.sort(files, this); 

      File newest = files[files.length - 1]; 

      return newest.toString; 
     } else { 
      return ""; 
     } 
} 
+0

Aha! Brillant! Je n'ai absolument pas pensé à ça. Merci :) –

Questions connexes