Bóson Treinamentos em Ciência e Tecnologia

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

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

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:

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:

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:

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:

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);
    }
  }
}

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.

 

Sair da versão mobile