Apache Commons IO
1. Visão geral
O projeto Apache Commons foi criado para fornecer aos desenvolvedores um conjunto de bibliotecas comuns que eles podem usar em seu código do dia-a-dia.
Neste tutorial, vamos explorar algumas das principais classes de utilitários do módulo Commons IO e suas funções mais conhecidas.
2. Dependência do Maven
Para usar a biblioteca, vamos incluir a seguinte dependência Maven empom.xml:
commons-io
commons-io
2.5
As versões mais recentes da biblioteca podem ser encontradas emMaven Central.
3. Classes de utilidade
Simplificando, as classes de utilitário fornecem conjuntos de métodos estáticos que podem ser usados paraperform common tasks on files.
3.1. FileUtils
Essa classe fornece operações diferentes nos arquivos, como abrir, ler, copiar e mover.
Vejamoshow to read or copy files usandoFileUtils:
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. FilenameUtils
Este utilitário fornece umoperating-system-agnostic way of executing common functions on file names. Vejamos alguns dos diferentes métodos que podemos utilizar:
String fullPath = FilenameUtils.getFullPath(path);
String extension = FilenameUtils.getExtension(path);
String baseName = FilenameUtils.getBaseName(path);
3.3. FileSystemUtils
Podemos usarFileSystemUtils acheck the free space on a given volume or drive:
long freeSpace = FileSystemUtils.freeSpaceKb("/");
4. Entrada e saída
Este pacote fornece várias implementações paraworking with input and output streams.
Vamos nos concentrar emTeeInputStream eTeeOutputSteam. A palavra “Tee” (derivada da letra “T“) é normalmente usada para descrever que uma única entrada deve ser dividida em duas saídas diferentes.
Vejamos um exemplo que demonstra como podemoswrite a single input stream to two different output streams:
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. Filtros
O Commons IO inclui uma lista de filtros de arquivos úteis. Isso pode ser útil quando um desenvolvedor desejanarrow down to a specific desired list of files de uma lista heterogênea de arquivos.
A biblioteca também suporta operações lógicasANDeOR em uma determinada lista de arquivos. Portanto, podemos misturar e combinar esses filtros para obter o resultado desejado.
Vejamos um exemplo que usaWildcardFileFiltereSuffixFileFilter para recuperar arquivos que têm “ple” em seus nomes com um sufixo “txt”. Observe que envolvemos os filtros acima usandoANDFileFilter:
@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. Comparadores
O pacoteComparator fornecedifferent types of comparisons on files. Exploraremos dois comparadores diferentes aqui.
6.1. PathFileComparator
A classePathFileComparator pode ser usada parasort lists or arrays of files by their path tanto em uma forma com distinção entre maiúsculas e minúsculas, ou com diferenciação de maiúsculas e minúsculas dependente do sistema. Vamos ver como classificar os caminhos de arquivo no diretório de recursos usando este utilitário:
@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());
}
Observe que usamos a configuraçãoIOCase.INSENSITIVE. PathFileComparator também fornece um número desingleton instances that have different case-sensitivity and reverse-sorting options.
Esses campos estáticos incluemPATH_COMPARATOR, PATH_INSENSITIVE_COMPARATOR, PATH_INSENSITIVE_REVERSE, PATH_SYSTEM_COMPARATOR,, para citar alguns.
6.2. SizeFileComparator
SizeFileComparator é, como o próprio nome sugere, usado paracompare the sizes (lengths) of two files. Ele retorna um valor inteiro negativo se o tamanho do primeiro arquivo for menor que o do segundo arquivo. Ele retorna zero se os tamanhos dos arquivos são iguais e um valor positivo se o tamanho do primeiro arquivo é maior que o tamanho do segundo arquivo.
Vamos escrever um teste de unidade demonstrando uma comparação de tamanhos de arquivo:
@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. Monitor de Arquivo
O pacote do monitor Commons IO fornece a capacidade detrack changes to a file or directory. Vejamos um exemplo rápido de comoFileAlterationMonitor pode ser usado junto comFileAlterationObservereFileAlterationListener para monitorar um arquivo ou pasta.
QuandoFileAlterationMonitor começar, começaremos a receber notificações para alterações de arquivo no diretório que está sendo monitorado:
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. Conclusão
Este artigo abordou alguns dos componentes mais usados do pacote Commons IO. No entanto, o pacote também possui muitos outros recursos. ConsulteAPI documentation para obter mais detalhes.
O código usado neste exemplo pode ser encontrado emGitHub project.