quarta-feira, 27 de fevereiro de 2013

Utilizando FileVisitor

Neste post vou mostrar como seguir por uma árvore de diretórios procurando um conjunto de arquivos que atendam ao padrão de pesquisa passado como segundo argumento na linha de comando. Para que nosso exemplo funcione utilizamos de dois recursos:
  • Files.walkFileTree
    • este é um método estático de Files (quer dizer que não temos que chamar new Files() para poder chamá-lo)
    • a assinatura do método é
walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor)
    • informamos portanto:
    1. o caminho inicial em start,
    2. as opções. atualmente somente existe FOLLOW_LINKS
    3. maxDepth que indica a profundidade na subárvore de diretórios que iremos realizar a busca. Se colocarmos este valor igual a zero, os subdiretórios dentro de start não serão pesquisados.
    4. a nossa classe que implementa FileVisitor
  • a interface FileVisitor
    • a classe que implementa esta interface é utilizada para tratar cada arquivo localizado durante a pesquisa e possui 4 métodos que são chamados na medida que é realizada a busca na estrutura de diretórios
      • preVisitDirectory: é chamado quando entramos o diretório e ainda nenhum dos itens deste diretório (arquivos ou subdiretórios que estão dentro dele) foi analisado
      • visitFile: é chamado quando uma entrada em um diretório (seja ela um arquivo, um link ou um subdiretório) é analisado
      • postVisitDirectory: é chamado depois que todos os arquivos e subdiretórios deste diretório foram analisados e imediatamente antes de sair dele para analisar o próximo
      • visitFileFailed


Vamos a nossa classe completa:

Aqui esta a implementação de FileVisitor como uma classe contida no mesmo arquivo da nossa classe principal Find. Basicamente utilizamos 2 métodos da interface:

  • visitFile: é utilizado para apresentar um arquivo na estrutura de diretórios que atende ao padrão indicado
  • preVisitDirectory: é utilizado para apresentar um diretório que atende ao padrão


Vamos rodar agora para simular as nossas buscas:

  • java Find
  • java Find . "*.java"
  • java Find . "*.java~"


Tentem rodar por exemplo java Find / "*.java", você vai receber um erro. O problema é que o caracter / é um caracter especial. Para procurar a partir do raiz temos que usar um subterfúgio... chamamos java Find /. "*.java".

quarta-feira, 13 de fevereiro de 2013

Mostrar atributos de um arquivo

Continuando as observações sobre as características de um arquivo, vamos explorar alguns outros métodos da classe Files para obter:
  • Se existe o arquivo no caminho especificado
  • Se este arquivos não existe (equivale ao not do anterior)
  • Se o path indicado é um diretório
  • Se é um arquivo regular
  • Se é um arquivo executável
  • Se temos permissão de leitura
  • Se temos permissão de escrita 
  • Se é um arquivo Escondido (atributo hidden ativado)
  • Se é um link simbólico
  • Qual a data de modificação deste arquivo (diretório, link etc)
  • Qual o tamanho deste arquivo

Vamos a nossa classe

Ler o tamanho de um arquivo

Vamos criar uma classe bastante simples que servirá de base para nossas outras experiências com manipulação de arquivos com java.nio. Nesta classe vamos ver o tamanho de um arquivo em bytes. A classe principal que utilizaremos é java.nio.file.Files que possui o método size(Path) que irá nos permitir ver o tamanho.

Vamos ao vídeo: