Obter informações sobre arquivos e diretórios com Java e classes NIO

Obter informações sobre arquivos e diretórios com Java e classes NIO

Os dados presentes na memória RAM do computador são temporários, o que significa que são perdidos em algum momento, por exemplo ao desligar a máquina. Isso inclui dados presentes nas variáveis dentro de um programa – como as aplicações Java – o que nos traz o seguinte problema: como armazenar dados de forma permanente, sem que haja perda de informação?

A questão é muito importante, pois é muito comum que haja a necessidade de armazenar informação para uso posterior. Para tal fazemos uso de arquivos, que são conjuntos de dados estruturados armazenados em dispositivos de armazenamento secundários, como um disco rígido, SSD ou mídia óptica, por exemplo. Dados gravados nesses dispositivos são dados persistentes – continuam existindo mesmo após terminada a execução de um programa.

Neste lição vamos introduzir a manipulação de arquivos em Java, mostrando como é possível obter informações sobre arquivos e diretórios existentes em uma mídia, como no HD do computador.

O que veremos neste tutorial:

Classes para manipulação de arquivos em Java

Existem diversas classes e interfaces que permitem a manipulação de arquivos e pastas em Java. Vamos estudar as seguintes neste tutorial:

  • Pacote java.nio.file
  • Classe Paths
  • Classe Files
  • Interface Path
  • Interface DirectoryStream

Fluxos (Streams)

Em Java, os arquivos são vistos como fluxos sequenciais de bytes (streams). Ao processar um arquivo, o Java processa um fluxo de bytes até encontrar um marcador especial que indica o final do fluxo – ou seja, o final do arquivo. Chamamos a esse marcados de Marcador de Fim-de-Arquivo (End-Of-File / EOF).

Os fluxos de dados podem ser de dois tipos:

  • Baseado em Bytes – Os dados são lidos e gravados em formato binário (bits), de modo que, por exemplo, um dado do tipo int ocupe quatro bytes, um do tipo char, dois bytes, e assim sucessivamente, dependendo do tipo de dado. Arquivos criados com fluxo baseado em bytes são denominados Arquivos Binários.
    Somente programas que entendam a organização dos bytes são capazes de ler esse tipo de arquivo.
  • Baseado em Caracteres – Neste caso, os dados são lidos e gravados como sequências de caracteres, sendo que cada caractere tem dois bytes de tamanho, e o tamanho de um dado depende, assim, do número de caracteres que ele possui. Arquivos criados com fluxo baseado em caracteres são denominados Arquivos de Texto.
    Editores de texto são capazes de ler este tipo de arquivo.

Fluxos e dispositivos especiais

Um fluxo de dados pode ser associado a diferentes dispositivos pelo Java. Ao iniciar um programa, o Java cria três objetos de fluxo, associados com dispositivos: System.in, System.out e System.err. Dois deles você provavelmente já viu em algum programa – lembra-se do System.in em um objeto Scanner, ou do System,out ao chamar um método printf ou println? Esses dispositivos representam o seguinte:

  • System.in – Dispositivo de entrada padrão, que habilita um programa a receber dados oriundos do teclado.
  • System.out – Saída padrão. Habilita o programa a enviar dados de saída à tela.
  • System.err – Erro padrão. Permite que um programa envie mensagens de erro para a tela.

Esses fluxos de dados podem ser redirecionados, de modo que seja possível ler entrada de dados de outros dispositivos, por exemplo, ou enviá-los para outro local.

Pacotes java.io e java.nio

Esses pacotes possuem as classes e interfaces empregadas no processamento de fluxos de dados em Java. Vamos trabalhar com esses elementos em um programa simples, que irá mostrar dados sobre arquivos e diretórios especificados no console. Antes disso, vamos descrever as principais classes que serão empregadas:

  • Interface Path – Os objetos de classes que implementam esta interface permitem representar o local de um arquivo ou diretório no sistema. Porém, não permitem abrir ou editar arquivos.
  • Interface DirectoryStream – Os objetos de classes que implementam esta interface permitem que a aplicação seja capaz de iterar pelo conteúdo de uma pasta no sistema.
  • Classe Paths – Esta classe fornece métodos estáticos que são empregados para obter um objeto Path, que representa o local de um arquivo ou diretório no sistema. Um objeto Path é criado por meio do uso do método estático get desta classe, o qual converte uma String que representa o local de um arquivo ou diretório no objeto.
  • Classe Files – Esta classe fornece métodos estáticos que podem ser usados para realizar manipulação de arquivos e diretórios, como criar, excluir ou copiar arquivos, obter dados sobre arquivos e diretórios, ler o conteúdo de um arquivo, entre outros.

Exemplo

No exemplo mostrado a seguir, usamos as classes e interfaces apresentadas para obter informações sobre um arquivo ou diretório, cujo caminho é fornecido pelo usuário e lido por um objeto Scanner.

package lerGravarArquivos;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;
public class LerGravarArquivos {

  public static void main(String[] args) throws IOException {

    Scanner entrada = new Scanner(System.in);
    System.out.println("Entre com o nome do arquivo ou diretório:");

    // Criar objeto Path com a entrada fornecida pelo usuário
    Path caminho = Paths.get(entrada.nextLine());

    // Verificar se o caminho existe, e mostrar informações sobre ele em caso positivo:
    if (Files.exists(caminho)) {
      System.out.printf("Nome do arquivo: %s%n", caminho.getFileName());
      System.out.printf("É diretório? %s%n",Files.isDirectory(caminho)?"Sim":"Não");
      System.out.printf("Última modificação: %s%n",Files.getLastModifiedTime(caminho));
      System.out.printf("Tamanho: %s%n",Files.size(caminho));
      System.out.printf("Caminho: %s%n",caminho);

      //Se for diretório, mostrar seu conteúdo:
      if (Files.isDirectory(caminho)) {
        System.out.println("Conteúdo do diretório:\n");
        DirectoryStream<Path> directoryStream = Files.newDirectoryStream(caminho);
        for (Path cam : directoryStream) {
          System.out.println(cam);
        }
      }
    }
    else { // Se o caminho não for arquivo ou diretório, apresentar mensagem de erro
      System.out.printf("%nO caminho %s não existe.",caminho);
    }
  }
}

obter dados sobre Arquivos e diretórios em Java

Os métodos empregados são, basicamente, auto-explicativos. Note que é importante acrescentar a declaração throws IOException no método main, caso contrário alguns dos métodos empregados no programa não serão executados pelo compilador.

Nas próximas lições veremos como criar, editar e manipular arquivos de texto em Java.

 

Sobre Fábio dos Reis (1333 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 25 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Unix, Linux e Open Source em geral, adora Eletrônica e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

Escreva um comentário

Seu e-mail não será divulgado


*