2014-09-07 3 views
0

Ce programme prend trop de temps pour calculer le répertoire Windows sous c:/Windows. Comment le faire aussi vite que le système d'exploitation donne la taille d'un répertoire. Calcul de la taille du répertoire ou du fichier


    import java.io.File; 
    import java.util.Scanner;

public class DirectorySize { 
    public static void main(String[] args) { 
     // Prompt the user to enter a directory or a file 
     System.out.println("Enter a directory or a file: "); 
     Scanner input = new Scanner(System.in); 
     String directory = input.nextLine(); 

     // Display the size 
     System.out.println(getSize(new File(directory)) + " bytes"); 
    } 

    public static long getSize(File file) { 
     long size = 0; // Store total size of all files 

     if(file.isDirectory()) { 
      File[] files = file.listFiles(); // All files and subdirectories 
      for(int i = 0; files != null && i < files.length; i++) { 
       size += getSize(files[i]); // Recursive call 
      } 
     } else { 
      size += file.length(); 
     } 

     return size; 
    } 
} 

+0

Une petite amélioration peut être de vérifier si les fichiers [i] est un répertoire avant de faire l'appel récursif. Cela permettra d'économiser beaucoup d'appels récursifs inutiles. – shlomi33

+0

Peut utiliser cette solution: http://stackoverflow.com/questions/2149785/get-size-of-folder-or-file – BachT

+0

BTW, pourquoi écrire ce code seul? Quelqu'un d'autre l'a fait avant toi + probablement l'a optimisé! Regardez ici org.apache.commons.io.FileUtils.sizeOfDirectory – shlomi33

Répondre

0

Pourquoi vous n'utilisez pas nio api, qui sont mieux et un peu plus rapide que java.io. Si vous remplacez votre fonction getSize() par la ligne de code ci-dessous, vous obtiendrez une amélioration des performances (40%).

static long getSize(Path startPath) throws IOException { 
     final AtomicLong size = new AtomicLong(0); 
     Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() { 
      @Override 
      public FileVisitResult visitFile(Path file, 
        BasicFileAttributes attrs) throws IOException { 
       size.addAndGet(attrs.size()); 
       return FileVisitResult.CONTINUE; 
      } 

      public FileVisitResult visitFileFailed(Path file, IOException exc) 
        throws IOException { 
       // Skip folders that can't be traversed 
       System.out.println("skipped: " + file + "e=" + exc); 
       return FileVisitResult.CONTINUE; 
      } 
     }); 
     return size.get(); 
    } 
0

Essayez avec apache commons-io vous pouvez l'obtenir à partir here

long size = FileUtils.sizeOfDirectory(new File("C:/Windows")); 
System.out.println("Folder Size: " + size + " bytes"); 
Questions connexes