Apache Commons IO

1. Panoramica

Il progetto Apache Commons è stato creato per fornire agli sviluppatori una serie di librerie comuni che possono utilizzare nel loro codice quotidiano.

In questo tutorial, esploreremo alcune delle principali classi di utilità del modulo Commons IO e le loro funzioni più note.

2. Dipendenza da Maven

Per utilizzare la libreria, includiamo la seguente dipendenza Maven nel pom.xml :

 commons-io commons-io 2.5 

Le ultime versioni della libreria sono disponibili in Maven Central.

3. Classi di utilità

In poche parole, le classi di utilità forniscono set di metodi statici che possono essere utilizzati per eseguire attività comuni sui file .

3.1. FileUtils

Questa classe fornisce diverse operazioni sui file, come l'apertura, la lettura, la copia e lo spostamento.

Diamo un'occhiata a come leggere o copiare file usando FileUtils :

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

3.2. NomefileUtils

Questa utilità fornisce un modo indipendente dal sistema operativo per eseguire funzioni comuni sui nomi di file . Vediamo alcuni dei diversi metodi che possiamo utilizzare:

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

3.3. FileSystemUtils

Possiamo usare FileSystemUtils per controllare lo spazio libero su un dato volume o unità :

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

4. Ingresso e uscita

Questo pacchetto fornisce diverse implementazioni per lavorare con flussi di input e output .

Ci concentreremo su TeeInputStream e TeeOutputSteam . La parola " Tee " (derivata dalla lettera " T ") viene normalmente utilizzata per descrivere che un singolo ingresso deve essere suddiviso in due diverse uscite.

Diamo un'occhiata a un esempio che dimostra come possiamo scrivere un singolo flusso di input in due diversi flussi di output :

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

5. Filtri

Commons IO include un elenco di utili filtri di file. Questi possono tornare utili quando uno sviluppatore desidera restringere il campo a un elenco di file desiderato specifico da un elenco di file eterogeneo.

La libreria supporta anche operazioni logiche AND e OR su un determinato elenco di file. Pertanto, possiamo combinare e abbinare questi filtri per ottenere il risultato desiderato.

Vediamo un esempio che fa uso di WildcardFileFilter e SuffixFileFilter per recuperare file che hanno " ple " nei loro nomi con un suffisso " txt ". Nota che avvolgiamo i filtri sopra usando ANDFileFilter :

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

6. Comparatori

Il pacchetto Comparator fornisce diversi tipi di confronti sui file . Esploreremo due diversi comparatori qui.

6.1. PathFileComparator

La classe PathFileComparator può essere utilizzata per ordinare elenchi o matrici di file in base al percorso in modo sensibile al maiuscolo / minuscolo, senza distinzione tra maiuscole e minuscole o dipendente dal sistema. Vediamo come ordinare i percorsi dei file nella directory delle risorse utilizzando questa utility:

@Test public void whenSortDirWithPathFileComparator_thenFirstFile_aaatxt() throws IOException { PathFileComparator pathFileComparator = new PathFileComparator( IOCase.INSENSITIVE); String path = FilenameUtils.getFullPath(getClass() .getClassLoader() .getResource("fileTest.txt") .getPath()); File dir = new File(path); File[] files = dir.listFiles(); pathFileComparator.sort(files); assertEquals("aaa.txt", files[0].getName()); }

Notare che abbiamo utilizzato la configurazione IOCase.INSENSITIVE . PathFileComparator fornisce anche una serie di istanze singleton con diverse opzioni di distinzione tra maiuscole e minuscole e ordinamento inverso .

Questi campi statici includono PATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR, solo per citarne alcuni.

6.2. SizeFileComparator

SizeFileComparator è, come suggerisce il nome, utilizzato per confrontare le dimensioni (lunghezze) di due file . Restituisce un valore intero negativo se la dimensione del primo file è inferiore a quella del secondo file. Restituisce zero se le dimensioni del file sono uguali e un valore positivo se la dimensione del primo file è maggiore della dimensione del secondo file.

Scriviamo uno unit test che dimostri un confronto delle dimensioni dei file:

@Test public void whenSizeFileComparator_thenLargerFile_large() throws IOException { SizeFileComparator sizeFileComparator = new SizeFileComparator(); File largerFile = FileUtils.getFile(getClass().getClassLoader() .getResource("fileTest.txt") .getPath()); File smallerFile = FileUtils.getFile(getClass().getClassLoader() .getResource("sample.txt") .getPath()); int i = sizeFileComparator.compare(largerFile, smallerFile); Assert.assertTrue(i > 0); }

7. File Monitor

Il pacchetto Commons IO monitor fornisce la capacità di tenere traccia delle modifiche a un file o una directory . Vediamo un rapido esempio di come FileAlterationMonitor può essere utilizzato insieme a FileAlterationObserver e FileAlterationListener per monitorare un file o una cartella.

Quando FileAlterationMonitor viene avviato , inizieremo a ricevere notifiche per le modifiche ai file nella directory che viene monitorata :

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

8. Conclusione

Questo articolo ha trattato alcuni dei componenti comunemente usati del pacchetto Commons IO. Tuttavia, il pacchetto include anche molte altre funzionalità. Fare riferimento alla documentazione API per maggiori dettagli.

Il codice utilizzato in questo esempio può essere trovato nel progetto GitHub.