Apache Commons IO

1. Overzicht

Het Apache Commons-project is gemaakt om ontwikkelaars een reeks gemeenschappelijke bibliotheken te bieden die ze in hun dagelijkse code kunnen gebruiken.

In deze tutorial zullen we enkele van de belangrijkste utility-klassen van de Commons IO-module en hun meest bekende functies verkennen.

2. Maven Afhankelijkheid

Om de bibliotheek te gebruiken, nemen we de volgende Maven-afhankelijkheid op in het pom.xml:

 commons-io commons-io 2.5 

De nieuwste versies van de bibliotheek zijn te vinden in Maven Central.

3. Utiliteitsklassen

Simpel gezegd, hulpprogramma-klassen bieden sets van statische methoden die kunnen worden gebruikt voor voer algemene taken uit op bestanden.

3.1. FileUtils

Deze klasse biedt verschillende bewerkingen op bestanden, zoals openen, lezen, kopiëren en verplaatsen.

Laten we eens kijken hoe u bestanden kunt lezen of kopiëren gebruik makend van FileUtils:

Bestandsbestand = FileUtils.getFile (getClass (). GetClassLoader () .getResource ("fileTest.txt") .getPath ()); Bestand tempDir = FileUtils.getTempDirectory (); FileUtils.copyFileToDirectory (bestand, tempDir); Bestand newTempFile = FileUtils.getFile (tempDir, file.getName ()); String data = FileUtils.readFileToString (newTempFile, Charset.defaultCharset ());

3.2. BestandsnaamUtils

Dit hulpprogramma biedt een besturingssysteem-agnostische manier om veelgebruikte functies op bestandsnamen uit te voeren. Laten we eens kijken naar enkele van de verschillende methoden die we kunnen gebruiken:

String fullPath = FilenameUtils.getFullPath (pad); String extension = FilenameUtils.getExtension (pad); String baseName = FilenameUtils.getBaseName (pad);

3.3. FileSystemUtils

We kunnen gebruiken FileSystemUtils naar controleer de vrije ruimte op een bepaald volume of station:

lang freeSpace = FileSystemUtils.freeSpaceKb ("/");

4. Invoer en uitvoer

Dit pakket biedt verschillende implementaties voor werken met input- en outputstromen.

We zullen ons concentreren op TeeInputStream en TeeOutputSteam. Het woord "T-stuk"(Afgeleid van letter"T“) Wordt normaal gesproken gebruikt om te beschrijven dat een enkele ingang moet worden opgesplitst in twee verschillende uitgangen.

Laten we eens kijken naar een voorbeeld dat laat zien hoe we dat kunnen schrijf een enkele input-stream naar twee verschillende output-streams:

String str = "Hallo wereld."; ByteArrayInputStream inputStream = nieuwe ByteArrayInputStream (str.getBytes ()); ByteArrayOutputStream outputStream1 = nieuwe ByteArrayOutputStream (); ByteArrayOutputStream outputStream2 = nieuwe ByteArrayOutputStream (); FilterOutputStream teeOutputStream = nieuwe TeeOutputStream (outputStream1, outputStream2); nieuwe TeeInputStream (inputStream, teeOutputStream, true) .read (nieuwe byte [str.length ()]); assertEquals (str, String.valueOf (outputStream1)); assertEquals (str, String.valueOf (outputStream2));

5. Filters

Commons IO bevat een lijst met nuttige bestandsfilters. Deze kunnen van pas komen als een ontwikkelaar dat wil beperk je tot een specifieke gewenste lijst met bestanden uit een heterogene lijst met bestanden.

De bibliotheek ondersteunt ook EN en OF logische bewerkingen op een gegeven bestandslijst. Daarom kunnen we deze filters mixen en matchen om het gewenste resultaat te krijgen.

Laten we eens kijken naar een voorbeeld dat gebruik maakt van WildcardFileFilter en AchtervoegselFileFilter om bestanden op te halen met "ple"In hun naam met een"tekst”Achtervoegsel. Merk op dat we bovenstaande filters omwikkelen met ANDFileFilter:

@Test openbare leegte whenGetFilewith_ANDFileFilter_thenFind_sample_txt () gooit IOException {String path = getClass (). GetClassLoader () .getResource ("fileTest.txt") .getPath (); Bestandsmap = FileUtils.getFile (FilenameUtils.getFullPath (pad)); assertEquals ("sample.txt", dir.list (nieuw AndFileFilter (nieuw WildcardFileFilter ("* ple *", IOCase.INSENSITIVE), nieuw SuffixFileFilter ("txt"))) [0]); }

6. Vergelijkers

De Comparator pakket biedt verschillende soorten vergelijkingen van bestanden. We zullen hier twee verschillende vergelijkers onderzoeken.

6.1. PathFileComparator

De PathFileComparator klasse kan worden gebruikt sorteer lijsten of arrays met bestanden op hun pad ofwel op een hoofdlettergevoelige, hoofdletterongevoelige of systeemafhankelijke hoofdlettergevoelige manier. Laten we eens kijken hoe we bestandspaden in de bronnenmap kunnen sorteren met behulp van dit hulpprogramma:

@Test openbare leegte whenSortDirWithPathFileComparator_thenFirstFile_aaatxt () gooit IOException {PathFileComparator pathFileComparator = nieuwe PathFileComparator (IOCase.INSENSITIVE); String path = FilenameUtils.getFullPath (getClass () .getClassLoader () .getResource ("fileTest.txt") .getPath ()); Bestandsmap = nieuw bestand (pad); Bestand [] bestanden = dir.listFiles (); pathFileComparator.sort (bestanden); assertEquals ("aaa.txt", bestanden [0] .getName ()); }

Merk op dat we de IOCase.INSENSITIVE configuratie. PathFileComparator biedt ook een aantal singleton-instanties die verschillende hoofdlettergevoeligheids- en omgekeerde sorteeropties hebben.

Deze statische velden omvatten PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR, om er maar een paar te noemen.

6.2. SizeFileComparator

SizeFileComparator is, zoals de naam suggereert, gewend vergelijk de maten (lengtes) van twee bestanden. Het retourneert een negatief geheel getal als de grootte van het eerste bestand kleiner is dan die van het tweede bestand. Het retourneert nul als de bestandsgrootte gelijk is en een positieve waarde als de grootte van het eerste bestand groter is dan de grootte van het tweede bestand.

Laten we een eenheidstest schrijven die een vergelijking van bestandsgroottes laat zien:

@Test openbare leegte whenSizeFileComparator_thenLargerFile_large () gooit IOException {SizeFileComparator sizeFileComparator = nieuwe SizeFileComparator (); Bestand largeFile = FileUtils.getFile (getClass (). GetClassLoader () .getResource ("fileTest.txt") .getPath ()); Bestand kleinerFile = FileUtils.getFile (getClass (). GetClassLoader () .getResource ("sample.txt") .getPath ()); int i = sizeFileComparator.compare (groter bestand, kleiner bestand); Assert.assertTrue (i> 0); }

7. Bestandsmonitor

Het Commons IO-monitorpakket biedt de mogelijkheid om wijzigingen bijhouden in een bestand of map. Laten we een snel voorbeeld bekijken van hoe FileAlterationMonitor kan samen worden gebruikt met FileAlterationObserver en FileAlterationListener om een ​​bestand of map te bewaken.

Wanneer FileAlterationMonitor begint, zullen we meldingen ontvangen voor bestandswijzigingen in de directory die wordt gecontroleerd:

FileAlterationObserver waarnemer = nieuwe FileAlterationObserver (map); FileAlterationMonitor monitor = nieuwe FileAlterationMonitor (5000); FileAlterationListener fal = nieuw FileAlterationListenerAdaptor () {@Override public void onFileCreate (bestandsbestand) {// bij aanmaakactie} @Override public void onFileDelete (bestandsbestand) {// bij verwijderactie}}; observer.addListener (fal); monitor.addObserver (waarnemer); monitor.start ();

8. Conclusie

Dit artikel behandelde enkele van de veelgebruikte componenten van het Commons IO-pakket. Het pakket bevat echter ook veel andere mogelijkheden. Raadpleeg de API-documentatie voor meer details.

De code die in dit voorbeeld wordt gebruikt, is te vinden in het GitHub-project.