Classes

Classes de Arquivo

Classes de arquivo

Para trabalhar com arquivos em uma linguagem baseada na orientação a objetos necessariamente precisaremos compreender que deveremos tratá-los como objetos mas tendo em mente que a estrutura de diretórios em seu sistema operacional é o ponto central em nosso desenvolvimento.

Classes de Arquivo

Pastas

java.io.File

A classe File representa na linguagem Java tanto um arquivo quanto um diretório, a sua ligação com um arquivo\diretório físico em seu sistema operacional é definido no que chamamos de construtor de objetos conforme exemplo abaixo:

Vamos imaginar que em seu disco rígido HD exista o diretório\arquivo conforme o sistema operacional:

S.ODiretórioArquivo
WindowsC:\arquivosaula1.txt
Linux/home/arquivosaula1.txt

Como poderemos referenciar este arquivo dentro do nosso programa?

public class FileApp {
    public static void main(String[] args) {
        //O java necessita de uma barra dupla
        File fileWindows = new File("C:\\arquivos\\aula1.txt");
        //ou
        //File fileWindows = new File("C:/arquivos/aula1.txt");
        File fileLinux = new File("/home/arquivos/aula1.txt");
    }
}

Ao executarmos o nosso programa nenhum erro aconteceu, mas sabemos que: Se estivermos executando uma tentativa de ler ou escrever neste arquivo dependendo do sistema operacional, um erro poderá ser exibido algo do tipo: Arquivo não localizado.

Por ser um objeto originada do classe File, este objeto terá métodos úteis conforme ilustração a seguir:

public class FileApp {
    public static void main(String[] args) {
        File fileWindows = new File("C:/arquivos/aula1.txt");
        File fileLinux = new File("/home/arquivos/aula1.txt");

        //O método exists() retorna true ou false em caso da existência do arquivo
        System.out.println(fileWindows.exists());
        System.out.println(fileLinux.exists());

        //O método isFile() retorna true ou false caso estejamos nos referindo a um arquivo ou diretório
        System.out.println(fileWindows.isFile());

        //O método isDirectory() é o oposto de isFile()
        System.out.println(fileWindows.isDirectory());

    }
}

Métodos avançados

Vamos imaginar que o nosso diretório /arquivos quanto o arquivo aula1.txt ainda não existe em nosso sistema operacional, a classe File contém métodos capazes de realizar a criação de ambos correspondentemente.

public class FileApp {
    public static void main(String[] args) {
        File diretorio = new File("C:/arquivos");
        //criando o diretório no sistema operacional correspondente
        diretorio.mkdir();

        //teste o mkdirs()
        //diretorio.mkdirs();

        try {
            File aula1 = new File(diretorio, "aula1.txt");
            /*
                Criando o arquivo aula.txt no diretório mencionado no primeiro parâmetro
                com a necessidade de tratar uma exceção em caso de não existir o(s) diretório(s) mencionado(s)
             */
            aula1.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
Bem se já chegamos até aqui, isto já um bom sinal. Mesmo com arquivo completamente vazio, já temos o caminho de como a partir de agora aprender a ler e escrever na linguagem Java.

java.io.FileWriter

A classe Java FileWriter é usada para gravar dados orientados a caracteres em um arquivo.

  • Esta classe herda da classe OutputStreamWriter que, por sua vez, herda da classe Writer.
  • Os construtores dessa classe assumem que a codificação de caracteres padrão e o tamanho do buffer de bytes padrão são aceitáveis. Para especificar você mesmo esses valores, construa um OutputStreamWriter em um FileOutputStream.
  • FileWriter destina-se a escrever fluxos de caracteres. Para gravar fluxos de bytes brutos, considere usar um FileOutputStream.
  • FileWriter cria o arquivo de saída se ainda não estiver presente.

Vamos abordar alguns cenários:

  1. FileWriter(File file): Constrói um objeto FileWriter dado um objeto File, ele cria o arquivo com conteúdo inserido.
public class FileApp {
    public static void main(String[] args) {

        try {
            File aula1 = new File("C:/arquivo/aula1.txt");
            FileWriter writer = new FileWriter(aula1);

            String conteudo = "gleyson";

            // cada caractere será escrito no arquivo
            for (int i = 0; i < conteudo.length(); i++)
                writer.write(conteudo.charAt(i));

            System.out.println("Escrita no arquivo realizada com sucesso!! ");

            // fechando o arquivo
            writer.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
Em caso diretório de destino não existir ou houver algum erro de permissão de escrita, uma IOException será lançada. java.io.FileNotFoundException: C:\arquivo\aula1.txt (O sistema não pode encontrar o caminho especificado)
  1. FileWriter(File file, boolean append): Constrói um objeto FileWriter permitindo acrescentar novos conteúdos.
public class FileApp {
    public static void main(String[] args) {
        try {
            File aula1 = new File("C:/arquivos/aula1.txt");
            FileWriter writer = new FileWriter(aula1,true);
            String conteudo = "sampaio";
            // cada caractere será escrito no arquivo
            for (int i = 0; i < conteudo.length(); i++)
                writer.write(conteudo.charAt(i));
            System.out.println("Escrita no arquivo realizada com sucesso!! ");
            // fechando o arquivo
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

java.io.FileReader

A classe FileReader do pacote java.io pode ser usada para ler dados (em caracteres) de arquivos, ela estende a classe InputSreamReader.

Vamos abordar alguns cenários:

  1. FileReader(File file): Constrói um objeto FileReader pronto para compartilhar os caracteres existentes em um arquivo.
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class FileApp {
    public static void main(String[] args) {

        try {
            File aula1 = new File("C:/arquivos/aula1.txt");
            FileReader reader = new FileReader(aula1);

            //Aprendemos que mutação de texto é melhor usar StringBuilder
            StringBuilder conteudo = new StringBuilder();

            // considerando que arquivo contenha conteúdos
            // e enquanto houver caracteres para ser lido
            while (reader.ready()){
                // o método read retorna o caractere em forma de inteiro
                //necessitando uma conversão explícita para char
                conteudo.append( (char) reader.read());
            }
            System.out.println("Leitura do arquivo realizada com sucesso !! ");
            System.out.println(conteudo.toString());
            // fechando o arquivo
            reader.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
Quanto a trabalhar com arquivos, a linguagem Java evoluiu de forma bem significativa proporcionando o que conhecemos como Java N-IO