En Java 7 con las nuevas API de E/S, ¿hay alguna manera fácil de mostrar el contenido de un directorio por fecha de última modificación? Básicamente, solo necesito obtener el archivo que no fue modificado durante el tiempo más largo (ordenar por la última modificación ascendente, tomar el primer nombre de archivo).¿Recibe los archivos en un directorio ordenado por la última modificación?
Respuesta
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.
lastModified()
Devuelve el tiempo que el archivo denotado por este nombre de ruta abstracto se modificó por última vez.
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. –
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
puede utilizar http://docs.oracle.com/javase/1.5.0/docs/api/java/io/File.html#listFiles(java.io.FileFilter) y suministrar http://docs.oracle.com/javase/1.5.0/docs/api/java/io/FileFilter.html
luego comparar http://docs.oracle.com/javase/1.5.0/docs/api/java/io/File.html#lastModified() y ya está
si no se preocupan por el rendimiento - entonces simplemente tomar uno con máximo/mínimo valor de la lista de archivos, que le dará O (n) complejidad
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.
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)
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 -> {
});
}
- 1. ¿Recibe la última fecha de modificación del archivo de los archivos de datos de la aplicación?
- 2. Última modificación de un directorio en OSX
- 3. Directorio última fecha de modificación
- 4. Recibe la última respuesta
- 5. Obteniendo la última fecha de modificación de archivos en el directorio usando PHP
- 6. ¿Cómo recursivo los archivos de la lista con el tamaño y la última hora de modificación?
- 7. Obtenga la última adición de archivos en un directorio
- 8. Cómo obtener el directorio más reciente (última modificación) [C#]
- 9. ¿Cómo puedo leer los archivos en un directorio en orden ordenado?
- 10. Última modificación de carpetas
- 11. Monitorización de modificación de directorio
- 12. ¿Cómo obtengo la última modificación de un recurso de Java?
- 13. ¿Cómo ordenar la salida de "grep -l" cronológicamente por la última fecha de modificación?
- 14. Obtener la última fecha de modificación de un archivo remoto
- 15. Cómo mostrar la hora de la última modificación de archivos en linux
- 16. ¿Cómo atravesar los archivos en un directorio?
- 17. Script PHP para recorrer todos los archivos en un directorio?
- 18. Lista de archivos por la última fecha editada
- 19. por/ordenado por
- 20. Obtener la fecha de la última modificación de una URL
- 21. ¿Cómo puedo obtener la fecha de última modificación de los objetos S3 con boto?
- 22. Proceso por lotes todos los archivos en el directorio
- 23. play-marco conseguir la fecha de última modificación de archivo
- 24. Conseguir un archivo de fecha de última modificación
- 25. copia de archivos PHP sin cambiar la fecha de última modificación
- 26. Cache Expire de control con la última modificación
- 27. Listar los archivos en un directorio y todos los subdirectorios
- 28. Archivos por lotes: enumere todos los archivos en un directorio con rutas relativas
- 29. Cómo ordenar archivos por fecha de modificación en iOS
- 30. ¿Cómo obtengo la última hora de modificación de un archivo en Perl?
gracias por la solución completa. File.listFiles() podría hacer que su código sea más corto :-) –
@ stefan.at.wpf Pero entonces no usaría NIO2 según su solicitud – Jeffrey
ah ok, lo siento, no lo noté. No necesito NIO, solo me preguntaba si NIO ofrecería una solución fácil ;-) –