Apache Commons IO
1. Oversigt
Apache Commons-projektet blev oprettet for at give udviklere et sæt almindelige biblioteker, som de kan bruge i deres daglige kode.
I denne vejledning undersøger vi nogle af de vigtigste nytteklasser i Commons IO-modulet og deres mest kendte funktioner.
2. Maven-afhængighed
For at bruge biblioteket, lad os medtage følgende Maven-afhængighed i pom.xml:
commons-io commons-io 2.5
De nyeste versioner af biblioteket findes i Maven Central.
3. Værktøjsklasser
Kort sagt, hjælpeklasser giver sæt statiske metoder, der kan bruges til udføre almindelige opgaver på filer.
3.1. FileUtils
Denne klasse giver forskellige handlinger på filer, såsom åbning, læsning, kopiering og flytning.
Lad os se på hvordan man læser eller kopierer filer ved brug af FileUtils:
Filfil = FileUtils.getFile (getClass (). GetClassLoader () .getResource ("fileTest.txt") .getPath ()); Fil tempDir = FileUtils.getTempDirectory (); FileUtils.copyFileToDirectory (fil, tempDir); Fil newTempFile = FileUtils.getFile (tempDir, file.getName ()); String data = FileUtils.readFileToString (newTempFile, Charset.defaultCharset ());
3.2. FilnavnUtils
Dette værktøj giver en operativsystem-agnostisk måde at udføre almindelige funktioner på filnavne på. Lad os se nogle af de forskellige metoder, vi kan bruge:
String fullPath = FilnavnUtils.getFullPath (sti); Strengeforlængelse = FilnavnUtils.getExtension (sti); String baseName = FilnavnUtils.getBaseName (sti);
3.3. FileSystemUtils
Vi kan bruge FileSystemUtils til tjek den ledige plads på en given lydstyrke eller drev:
lang freeSpace = FileSystemUtils.freeSpaceKb ("/");
4. Indgang og udgang
Denne pakke indeholder flere implementeringer til arbejde med input og output streams.
Vi fokuserer på TeeInputStream og TeeOutputSteam. Ordet "Tee”(Afledt af bogstavet“T“) Bruges normalt til at beskrive, at en enkelt indgang skal opdeles i to forskellige udgange.
Lad os se på et eksempel, der viser, hvordan vi kan skriv en enkelt inputstrøm til to forskellige outputstrømme:
String str = "Hej verden."; ByteArrayInputStream inputStream = ny ByteArrayInputStream (str.getBytes ()); ByteArrayOutputStream outputStream1 = ny ByteArrayOutputStream (); ByteArrayOutputStream outputStream2 = ny ByteArrayOutputStream (); FilterOutputStream teeOutputStream = ny TeeOutputStream (outputStream1, outputStream2); ny TeeInputStream (inputStream, teeOutputStream, sand) .læs (ny byte [str.length ()]); assertEquals (str, String.valueOf (outputStream1)); assertEquals (str, String.valueOf (outputStream2));
5. Filtre
Commons IO indeholder en liste over nyttige filfiltre. Disse kan være nyttige, når en udvikler ønsker det indsnævre til en bestemt ønsket liste over filer fra en heterogen liste over filer.
Biblioteket understøtter også OG og ELLER logiske operationer på en given filliste. Derfor kan vi blande og matche disse filtre for at få det ønskede resultat.
Lad os se et eksempel, der gør brug af WildcardFileFilter og SuffixFileFilter for at hente filer, der har “ple”I deres navne med en”txt”Suffiks. Bemærk, at vi pakker ovenstående filtre ved hjælp af ANDFileFilter:
@Test offentlig ugyldig nårGetFilewith_ANDFileFilter_thenFind_sample_txt () kaster IOException {String sti = getClass (). GetClassLoader () .getResource ("fileTest.txt") .getPath (); Fil dir = FileUtils.getFile (FilnavnUtils.getFullPath (sti)); assertEquals ("sample.txt", dir.list (new AndFileFilter (new WildcardFileFilter ("* ple *", IOCase.INSENSITIVE), new SuffixFileFilter ("txt"))] [0]); }
6. Komparatorer
Det Komparator pakke giver forskellige typer sammenligninger af filer. Vi undersøger to forskellige komparatorer her.
6.1. PathFileComparator
Det PathFileComparator klasse kan bruges til sorter lister eller arrays af filer efter deres sti enten på en sags-, sags- eller systemafhængig sagsfølsom måde. Lad os se, hvordan man sorterer filstier i ressourcemappen ved hjælp af dette værktøj:
@Test offentlig ugyldig nårSortDirWithPathFileComparator_thenFirstFile_aaatxt () kaster IOException {PathFileComparator pathFileComparator = ny PathFileComparator (IOCase.INSENSITIVE); Strengsti = FilnavnUtils.getFullPath (getClass () .getClassLoader () .getResource ("fileTest.txt") .getPath ()); Fil dir = ny fil (sti); Fil [] filer = dir.listFiles (); pathFileComparator.sort (filer); assertEquals ("aaa.txt", filer [0] .getName ()); }
Bemærk, at vi har brugt IOCase.INSENSITIVE konfiguration. PathFileComparator giver også et antal singleton-tilfælde, der har forskellige muligheder for store og små bogstaver og omvendt sortering.
Disse statiske felter inkluderer PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR, for at nævne nogle få.
6.2. SizeFileComparator
SizeFileComparator er, som navnet antyder, brugt til sammenlign størrelser (længder) på to filer. Det returnerer en negativ heltalværdi, hvis den første fils størrelse er mindre end den anden fil. Det returnerer nul, hvis filstørrelserne er ens, og en positiv værdi, hvis den første fils størrelse er større end den anden fils størrelse.
Lad os skrive en enhedstest, der viser en sammenligning af filstørrelser:
@Test offentlig ugyldig nårSizeFileComparator_thenLargerFile_large () kaster IOException {SizeFileComparator sizeFileComparator = ny SizeFileComparator (); Fil largerFile = FileUtils.getFile (getClass (). GetClassLoader () .getResource ("fileTest.txt") .getPath ()); Fil smallerFile = FileUtils.getFile (getClass (). GetClassLoader () .getResource ("sample.txt") .getPath ()); int i = sizeFileComparator.compare (largerFile, smallerFile); Assert.assertTrue (i> 0); }
7. Filovervågning
Commons IO-overvågningspakken giver mulighed for spore ændringer til en fil eller mappe. Lad os se et hurtigt eksempel på hvordan FileAlterationMonitor kan bruges sammen med FileAlterationObserver og FileAlterationListener for at overvåge en fil eller mappe.
Hvornår FileAlterationMonitor starter, begynder vi at modtage meddelelser om filændringer i den mappe, der overvåges:
FileAlterationObserver observatør = ny FileAlterationObserver (mappe); FileAlterationMonitor monitor = ny FileAlterationMonitor (5000); FileAlterationListener fal = ny FileAlterationListenerAdaptor () {@Override public void onFileCreate (File file) {// on create action} @Override public void onFileDelete (File file) {// on delete action}}; observer.addListener (fal); monitor.addObserver (observatør); monitor.start ();
8. Konklusion
Denne artikel dækkede nogle af de almindeligt anvendte komponenter i Commons IO-pakken. Pakken leveres dog også med mange andre muligheder. Se API-dokumentation for flere detaljer.
Koden, der bruges i dette eksempel, kan findes i GitHub-projektet.