2012-09-03 15 views

Respuesta

16

No hay "manera fácil" real para hacerlo, pero es posible:

List<Path> files = new ArrayList<>(); 
try(DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) { 
    for(Path p : stream) { 
     files.add(p); 
    } 
} 

Collections.sort(files, new Comparator<Path>() { 
    public int compare(Path o1, Path o2) { 
     try { 
      return Files.getLastModifiedTime(o1).compareTo(Files.getLastModifiedTime(o2)); 
     } catch (IOException e) { 
      // handle exception 
     } 
    } 
}); 

Esto ordenará los archivos de archivos lo más pronto posible de la última modificación. DirectoryStream s no iterar a través de subdirectorios.

+0

gracias por la solución completa. File.listFiles() podría hacer que su código sea más corto :-) –

+1

@ stefan.at.wpf Pero entonces no usaría NIO2 según su solicitud – Jeffrey

+0

ah ok, lo siento, no lo noté. No necesito NIO, solo me preguntaba si NIO ofrecería una solución fácil ;-) –

0
lastModified() 

Devuelve el tiempo que el archivo denotado por este nombre de ruta abstracto se modificó por última vez.

Java 7 - IO API

+0

Gracias, pero fuera de un directorio con 100 archivos como que necesito para obtener la más antigua, preguntando si hay una manera mejor que comparar manualmente todos los valores LastModified, por ejemplo, pasando solo una opción de clasificación y luego tomar la primera o la última entrada de la lista, dependiendo de la dirección de clasificación. –

+0

Para saber qué archivo es el más nuevo/más antiguo, es necesario recorrer todos los archivos. Que es lo que (según mi conocimiento) FileFilter hace. Lo único excepto lo mencionado en la publicación de jdevelop (EDITAR: probablemente muchas formas de lograr esto) sería crear un comparador como este 'Archivo f = nuevo Archivo (' '); Arrays.sort (f.listFiles(), nuevo Comparador () {int pública comparar (o1 Archivo, O2 Archivo) { retorno (int) (o1.lastModified() - o2.lastModified()); } }); return f [0]; ' – atomman

2

Use listFiles() en el objeto Archivo del directorio. Convierta la matriz en una lista de arrays. Luego, ordénelos usando un método de clasificación estático en la clase Colecciones con un Comparador personalizado que use el método getTotalSpace() en los Archivos. EDITAR: Use lastModified en lugar de getTotalSpace.

0

Nota: Esta solución requiere guayaba.

API Java IO/NIO proporciona acceso de bajo nivel a listados de directorios, pero no se realiza ningún procesamiento, que queda a la persona que llama. El nuevo J ava7 NIO DirectoryStream tiene la huella mínima al acceder a la lista del directorio para su posterior procesamiento, p. clasificación.

Aquí está mi solución : Leer archivos de DirectoryStream y construir una cola ordenada con (opcionalmente) tamaño limitado de la corriente. Devuelve los elementos más antiguos/más nuevos de la cola. Se requieren

private void listFilesOldestFirst(final File directory, final Integer maxNumberOfFiles) { 

    final Builder<File> builder = 
      MinMaxPriorityQueue 
      .orderedBy(LastModifiedFileComparator.LASTMODIFIED_COMPARATOR); 
    if(maxNumberOfFiles != null) { 
     builder.maximumSize(maxNumberOfFiles); 
    } 

    // queue with constant space, if maxNumberOfFiles is set, otherwise behaves like an unbound queue with an O(log n) penalty for insertion 
    final MinMaxPriorityQueue<File> oldestFiles = builder.create(); 

    try(DirectoryStream<Path> stream = Files.newDirectoryStream(directory.toPath())) { 
     for(final Path p : stream) { 
      oldestFiles.add(p.toFile()); 
     } 
    } catch (final IOException e) { 
     throw new RuntimeException(e); 
    } 

    final File[] fileArray = oldestFiles.toArray(new File[]{}); 
    Arrays.sort(fileArray, oldestFiles.comparator()); 
    // ... use fileArray 

    final ArrayList<File> arrayList = Lists.newArrayList(oldestFiles); 
    Collections.sort(arrayList, oldestFiles.comparator()); 
    // ... use arrayList 

} 

Estas dependencias para la guayaba MinMaxPriorityQueue y la FileComparator:

<dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>18.0</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.4</version> 
    </dependency> 

También puede encontrar el filtro de parámetro de Files.newDirectoryStream útil:

final Filter<Path> sampleFilter = new Filter<Path>() { 
     @Override 
     public boolean accept(final Path entry) throws IOException { 
      return true; // see commons-io -> FileFilterUtils 
     } 
    }; 

    ... 
    Files.newDirectoryStream(directory.toPath(), sampleFilter) 
4

Una variación levemente "continua" de la respuesta de Jeffrey, que algunos podrían encontrar más fácil también. Publicar para completar.

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) { 
    StreamSupport.stream(files.spliterator(), false) 
     .sorted((o1, o2) -> { 
      try { 
       return Files.getLastModifiedTime(o1).compareTo(Files.getLastModifiedTime(o2)); 
      } catch (IOException ex) { 
       ... 
      } 
     }) 
     .filter(file -> Files.isRegularFile(file)) 
     .forEach(file -> { 
     }); 
} 
Cuestiones relacionadas