Apache Commons IO

1. Pregled

Projekt Apache Commons stvoren je kako bi programerima pružio skup zajedničkih knjižnica koje mogu koristiti u svakodnevnom kodu.

U ovom uputstvu istražit ćemo neke od ključnih klasa uslužnih programa Commons IO modula i njihove najpoznatije funkcije.

2. Ovisnost Mavena

Da bismo koristili knjižnicu, uključimo sljedeću Mavenovu ovisnost u pom.xml:

 commons-io commons-io 2.5 

Najnovije verzije knjižnice možete pronaći u Maven Central.

3. Razredi korisnosti

Jednostavno rečeno, klase uslužnih programa pružaju skupove statičkih metoda na koje se može koristiti obavljati uobičajene zadatke na datotekama.

3.1. FileUtils

Ova klasa pruža različite operacije nad datotekama, poput otvaranja, čitanja, kopiranja i premještanja.

Pogledajmo kako čitati ili kopirati datoteke koristeći FileUtils:

Datoteka datoteka = FileUtils.getFile (getClass (). GetClassLoader () .getResource ("fileTest.txt") .getPath ()); Datoteka tempDir = FileUtils.getTempDirectory (); FileUtils.copyFileToDirectory (datoteka, tempDir); Datoteka newTempFile = FileUtils.getFile (tempDir, file.getName ()); Podaci niza = FileUtils.readFileToString (newTempFile, Charset.defaultCharset ());

3.2. Naziv datotekeUtils

Ovaj uslužni program pruža agnostički način izvršavanja operativnih sustava na imenima datoteka. Pogledajmo neke od različitih metoda koje možemo koristiti:

Niz fullPath = Ime datotekeUtils.getFullPath (put); Proširenje niza = FilenameUtils.getExtension (put); Niz baseName = Ime datotekeUtils.getBaseName (put);

3.3. FileSystemUtils

Možemo koristiti FileSystemUtils do provjerite slobodni prostor na zadanoj glasnoći ili pogonu:

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

4. Ulaz i izlaz

Ovaj paket nudi nekoliko implementacija za rad s ulaznim i izlaznim tokovima.

Usredotočit ćemo se na TeeInputStream i TeeOutputSteam. Riječ "Tee"(Izvedeno iz slova"T“) Se obično koristi za opisivanje da se jedan ulaz dijeli na dva različita izlaza.

Pogledajmo primjer koji pokazuje kako možemo zapisati jedan ulazni tok u dva različita izlazna toka:

String str = "Pozdrav svijetu."; ByteArrayInputStream inputStream = novi ByteArrayInputStream (str.getBytes ()); ByteArrayOutputStream outputStream1 = novi ByteArrayOutputStream (); ByteArrayOutputStream outputStream2 = novi ByteArrayOutputStream (); FilterOutputStream teeOutputStream = novi TeeOutputStream (outputStream1, outputStream2); novi TeeInputStream (inputStream, teeOutputStream, true) .read (novi bajt [str.length ()]); assertEquals (str, String.valueOf (outputStream1)); assertEquals (str, String.valueOf (outputStream2));

5. Filteri

Commons IO uključuje popis korisnih filtara datoteka. Oni mogu dobro doći kad programer to želi suzite na određeni željeni popis datoteka s heterogenog popisa datoteka.

Biblioteka također podržava I i ILI logičke operacije na danom popisu datoteka. Stoga ove filtre možemo kombinirati i podudarati kako bismo dobili željeni ishod.

Pogledajmo primjer koji koristi WildcardFileFilter i SuffixFileFilter za preuzimanje datoteka koje imaju "ple"U njihova imena s"txt”Sufiks. Imajte na umu da omotavamo gornje filtre pomoću ANDFileFilter:

@Test public void whenGetFilewith_ANDFileFilter_thenFind_sample_txt () baca IOException {String path = getClass (). GetClassLoader () .getResource ("fileTest.txt") .getPath (); Direktorij datoteke = FileUtils.getFile (FilenameUtils.getFullPath (put)); assertEquals ("sample.txt", dir.list (novi AndFileFilter (novi WildcardFileFilter ("* ple *", IOCase.INSENSITIVE), novi SuffixFileFilter ("txt"))) [0]); }

6. Usporednici

The Usporednik paket pruža različite vrste usporedbi na datotekama. Ovdje ćemo istražiti dvije različite usporedbe.

6.1. PathFileComparator

The PathFileComparator razred može se koristiti za sortirajte popise ili nizove datoteka prema njihovoj putanji bilo na velika i mala slova, na velika i mala slova ili na ovisnost o sustavu. Pogledajmo kako sortirati putove datoteka u direktoriju resursa pomoću ovog uslužnog programa:

@Test public void whenSortDirWithPathFileComparator_thenFirstFile_aaatxt () baca IOException {PathFileComparator pathFileComparator = new PathFileComparator (IOCase.INSENSITIVE); Niz puta = Ime datotekeUtils.getFullPath (getClass () .getClassLoader () .getResource ("fileTest.txt") .getPath ()); Dir datoteke = nova datoteka (put); Datoteka [] files = dir.listFiles (); pathFileComparator.sort (datoteke); assertEquals ("aaa.txt", datoteke [0] .getName ()); }

Imajte na umu da smo koristili IOCase.OSJETLJIVO konfiguracija. PathFileComparator također pruža brojne pojedinačne instance koje imaju različite mogućnosti osjetljivosti na velika i mala slova i obrnutog sortiranja.

Ova statička polja uključuju PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR, da nabrojimo nekoliko.

6.2. SizeFileComparator

SizeFileComparator je, kako mu samo ime govori, naviklo usporedite veličine (duljine) dviju datoteka. Vraća negativnu cijelu vrijednost ako je veličina prve datoteke manja od veličine druge datoteke. Vraća nulu ako su veličine datoteka jednake i pozitivnu vrijednost ako je veličina prve datoteke veća od veličine druge datoteke.

Napišimo jedinični test koji pokazuje usporedbu veličina datoteke:

@Test public void whenSizeFileComparator_thenLargerFile_large () baca IOException {SizeFileComparator sizeFileComparator = new SizeFileComparator (); Datoteka largerFile = FileUtils.getFile (getClass (). GetClassLoader () .getResource ("fileTest.txt") .getPath ()); Datoteka smallFile = FileUtils.getFile (getClass (). GetClassLoader () .getResource ("sample.txt") .getPath ()); int i = sizeFileComparator.compare (veća datoteka, manja datoteka); Assert.assertTrue (i> 0); }

7. Nadzornik datoteka

Paket Commons IO monitora pruža mogućnost pratiti promjene u datoteci ili direktoriju. Pogledajmo brzi primjer kako FileAlterationMonitor može se koristiti zajedno sa FileAlterationObserver i FileAlterationListener za nadgledanje datoteke ili mape.

Kada FileAlterationMonitor započinje, počet ćemo primati obavijesti o promjenama datoteka u direktoriju koji se nadgleda:

FileAlterationObserver promatrač = novi FileAlterationObserver (mapa); FileAlterationMonitor monitor = novi FileAlterationMonitor (5000); FileAlterationListener fal = new FileAlterationListenerAdaptor () {@Override public void onFileCreate (File file) {// on create action} @Override public void onFileDelete (File file) {// on delete action}}; promatrač.addListener (fal); monitor.addObserver (promatrač); monitor.start ();

8. Zaključak

Ovaj je članak obuhvatio neke od najčešće korištenih komponenti Commons IO paketa. Međutim, paket dolazi i s mnogim drugim mogućnostima. Za više detalja pogledajte API dokumentaciju.

Kôd korišten u ovom primjeru može se naći u projektu GitHub.