2009-12-17 5 views
1

J'ai besoin de créer un utilitaire Java qui se répètera à travers un système de fichiers Unix (et/ou Linux) et construira un modèle objet de la structure du répertoire, récupèrera les infos du fichier - taille, date de création, etc. besoin de récupérer des informations sur le périphérique de stockage physique sur lequel les fichiers sont assis. Idéalement, cet utilitaire sera portable. Je n'ai aucune expérience des bibliothèques standard Java et seulement une expérience limitée d'Unix OS.Marcher un système de fichiers Linux/Unix avec Java?

Existe-t-il des bibliothèques standard Java qui fonctionneront avec le système de fichiers Unix? Ou vais-je devoir faire des appels natifs via une API et m'inquiéter de la portabilité? Quelles options ai-je?

Répondre

5

Découvrez Apache Commons IO et FileUtils.iterator() en particulier. Cela vous permettra de naviguer dans le système de fichiers. Il vaut mieux utiliser un itérateur que de constituer une énorme liste de fichiers candidats, principalement en raison des problèmes de mémoire potentiels.

Si vous avez besoin d'un accès particulier aux liens symboliques, alors cela peut ne pas suffire, et vous voudrez peut-être consulter une version antérieure de JDK 7. Je comprends que le système de fichiers avec Java 7 aura some capabilities surrounding symlinks.

Remarque: de nombreux systèmes de fichiers Unix vous donneront ctime, qui correspond à la date de création inode et non à la date de création du fichier.

+0

Merci Brian. Connaissez-vous des ressources sur les limitations (comme * ctime * cité ci-dessus par exemple) de Java IO sur les systèmes de fichiers Unix? En général, pour des opérations assez basiques, Java est-il aussi bon que n'importe quoi d'autre pour marcher sur un système de fichiers Linux/Unix? – flesh

+0

Je voudrais vérifier l'objet File dans Java pour déterminer si cela fait ce que vous voulez. Pour * vraiment * interrogation de système de fichiers de bas niveau sur Unix, je suggérerais peut-être Perl. Il a accès aux statistiques au niveau du système que Java n'aura tout simplement pas (en raison de la JVM et de sa nature multiplateforme) –

+0

Note d'accompagnement: FileUtils.En fait, iterator89 * fait * dresse une liste de candidats en arrière-plan, qui n'est pas vraiment à l'échelle. –

3

Vous pouvez utiliser: java.io.File pour qu'il ne contienne pas toutes les informations dont vous avez besoin (comme les informations du stockage physique) mais il vous aidera à créer la majeure partie de la logique dont vous avez besoin.

Vous pouvez jeter un oeil à muucommander qui est un gestionnaire de fichiers open source. Ils ont déjà fait beaucoup de travail pour faire ce genre de choses, et le code est très propre et accessible.

Voici un exemple de travail:

import java.io.File; 


public class FileWalkTest { 
    public static void main(String[] args) { 
     File file = new File("/Users/oscarreyes/code/"); 
     printInfo(file); 
    } 
    public static void printInfo(File dir) { 
     for(File child : dir.listFiles()) { 
      if(child.isDirectory()) { 
       System.out.println("\n"+child.getAbsolutePath()); 
       printInfo(child); 
      } else { 
       System.out.printf("%s read:%s write:%s xecute:%s, size:%d lastModified:%d %n", child.getName(), child.canRead(), child.canWrite(), child.canExecute(), child.length(), child.lastModified()); 
      } 
     } 
     System.out.println(); 

    } 
} 
2

java.io.File est votre ami ici. Il a un certain nombre de méthodes qui vous permettent de lister le contenu d'un répertoire et de déterminer si ce qu'il trouve est un fichier ou un répertoire. Si c'est un répertoire, vous avez juste besoin de revenir en arrière. Une fois que vous savez que l'objet que vous avez est un fichier, il existe des méthodes que vous pouvez appeler pour obtenir des détails spécifiques.

Jetez un oeil à http://java.sun.com/j2se/1.5.0/docs/api/

Je crois que cela entièrement portable et

Dave

Questions connexes