Apache Commons IO

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.