Zoek het laatst gewijzigde bestand in een directory met Java

1. Overzicht

In deze korte zelfstudie gaan we nader bekijken hoe u het laatst gewijzigde bestand in een specifieke map in Java kunt vinden.

Eerst beginnen we met de legacy IO en de moderne NIO API's. Vervolgens zullen we zien hoe we de Apache Commons IO-bibliotheek kunnen gebruiken om hetzelfde te bereiken.

2. Gebruik de java.io API

De nalatenschap java.io pakket biedt het het dossier class om een ​​abstracte weergave van bestands- en mappadnamen in te kapselen.

Gelukkig is de het dossier class wordt geleverd met een handige methode genaamd laatst gewijzigd(). Deze methode retourneert de laatst gewijzigde tijd van het bestand, aangegeven door een abstracte padnaam.

Laten we nu kijken hoe we de java.io.File klasse om het beoogde doel te bereiken:

openbaar statisch bestand findUsingIOApi (String sdir) {File dir = nieuw bestand (sdir); if (dir.isDirectory ()) {Optioneel opFile = Arrays.stream (dir.listFiles (File :: isFile)) .max ((f1, f2) -> Long.compare (f1.lastModified (), f2.lastModified ( ))); if (opFile.isPresent ()) {return opFile.get (); }} retourneer null; }

Zoals we kunnen zien, gebruiken we de Java 8 Stream API om door een reeks bestanden te lopen. Vervolgens roepen we de max () bewerking om het bestand met de meest recente wijzigingen op te halen.

Merk op dat we een Optioneel instantie om het laatst gewijzigde bestand in te kapselen.

Houd er rekening mee dat deze aanpak als ouderwets en verouderd wordt beschouwd. We kunnen het echter gebruiken als we compatibel willen blijven met de oudere IO-wereld van Java.

3. Met behulp van de java.nio API

De introductie van de NIO API is een keerpunt voor het beheer van bestandssystemen. De nieuwe versie NIO.2 die in Java 7 wordt geleverd, wordt geleverd met een reeks verbeterde functies voor beter bestandsbeheer en -manipulatie.

In feite is de java.nio.file.Files class biedt grote flexibiliteit als het gaat om het manipuleren van bestanden en mappen in Java.

Laten we dus eens kijken hoe we gebruik kunnen maken van de Bestanden class om het laatst gewijzigde bestand in een directory te krijgen:

openbaar statisch pad findUsingNIOApi (String sdir) gooit IOException {Path dir = Paths.get (sdir); if (Files.isDirectory (dir)) {Optioneel opPath = Files.list (dir) .filter (p ->! Files.isDirectory (p)) .sorted ((p1, p2) -> Long.valueOf (p2.toFile () .lastModified ()) .compareTo (p1.toFile (). lastModified ())) .findFirst (); if (opPath.isPresent ()) {return opPath.get (); }} retourneer null; }

Net als in het eerste voorbeeld vertrouwen we op de Steam API om alleen bestanden op te halen. Vervolgens sorteren we onze bestanden op basis van de laatst gewijzigde tijd met behulp van een lambda-uitdrukking.

4. Apache Commons IO gebruiken

De Apache Commons IO heeft het beheer van bestandssystemen naar een hoger niveau getild. Het biedt een reeks handige klassen, bestandsvergelijkers, bestandsfilters en nog veel meer.

Gelukkig voor ons biedt de bibliotheek deLastModifiedFileComparator klasse die kan worden gebruikt als eencomparator om een ​​reeks bestanden te sorteren op hun laatst gewijzigde tijd.

Ten eerste moeten we de commons-io afhankelijkheid in onze pom.xml:

 commons-io commons-io 2.7 

Laten we tot slot laten zien hoe we het laatst gewijzigde bestand in een map kunnen vinden met Apache Commons IO:

openbaar statisch bestand findUsingCommonsIO (String sdir) {File dir = nieuw bestand (sdir); if (dir.isDirectory ()) {Bestand [] dirFiles = dir.listFiles ((FileFilter) FileFilterUtils.fileFileFilter ()); if (dirFiles! = null && dirFiles.length> 0) {Arrays.sort (dirFiles, LastModifiedFileComparator.LASTMODIFIED_REVERSE); retourneer dirFiles [0]; }} retourneer null; }

Zoals hierboven weergegeven, gebruiken we desingleton instantie LASTMODIFIED_REVERSE om onze reeks bestanden in omgekeerde volgorde te sorteren.

Omdat de array omgekeerd is gesorteerd, is het laatst gewijzigde bestand het eerste element van de array.

5. Conclusie

In deze tutorial hebben we verschillende manieren onderzocht om het laatst gewijzigde bestand in een bepaalde directory te vinden. Onderweg hebben we API's gebruikt die deel uitmaken van de JDK en de externe bibliotheek Apache Commons IO.

Zoals altijd is de volledige codebron van de voorbeelden beschikbaar op GitHub.