Classes de entrada e saída de dados em Java

Veja neste artigo quais são as principais classes responsáveis por tratar a entrada e saída de dados em aplicações Java. Serão apresentados exemplos de leitura e escrita de dados em console e em arquivos.

Introdução

A linguagem Java é capaz de processar arquivos que requisitam grandes quantidades de dados persistentes. Esses são os dados que ficam armazenados dentro dos arquivos, sendo que a sua duração vai além da finalização de um programa. Esse processamento de arquivos é uma capacidade que o Java oferece para ler e gravar dados na memória, arquivos e conexões de rede.

Quando existe um dispositivo de entrada de dados ativo, para obter dados deste dispositivo é usada uma ação conhecida como read(). E para enviar um dado para um dispositivo de saída é utilizado o método write().

Para trabalhar com entrada e saída de dados são utilizada as classes que estão dentro do java.io. Essas classes oferecem algumas funcionalidades como:

As entradas e saídas de dados são manipuladas como sequência de bytes, através das classes InputStream e OutputStream e as classes dependentes.

Classe InputStream

É uma classe abstrata que oferece a funcionalidade básica para a leitura de um byte ou de uma sequência de bytes a partir de alguma fonte.

Lendo um arquivo

Os métodos read() oferecem a leitura de bytes. O valor de retorno desse método é um inteiro, que pode ser o byte lido do próprio método ou número de bytes lidos do método read(byte[] b) sendo que quando o retorno for o valor de -1, é informado que o final do arquivo foi atingindo.

Listagem 1: Ler um byte de um arquivo.

InputStream is = new FileInputStream("arquivo.txt"); int valor = is.read();

Na Listagem 1, a classe abstrata InputStream é declarada inicializando uma classe dependente, a FileInputStream. Essa classe recebe uma String como argumento no construtor. Esse argumento é a definição de onde está localizado o arquivo.


Figura 1: Hierarquia da classe InputStream

Então as principais subclasses de InputStream são:

Listagem 2: Lendo Strings digitadas.

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class TestaEntrada { public static void main(String[] args) throws IOException{ InputStream is = System.in; System.out.print("Digite um texto: "); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String digitado = br.readLine(); while(digitado != null){ System.out.println("Texto Digitado = "+digitado); digitado = br.readLine(); } } }

OutputStream

É uma classe abstrata que transfere sequencialmente os bytes para algum destino. Os métodos write(), tem a função de escrever em forma de bytes para o destino onde vai enviar. Para mais informações acesse: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/OutputStream.html


Figura 2: Subclasses OutputStream

As classes abstratas Reader e Writer se envolvem na manipulação de arquivos (leitura e escrita) que contém caracteres.

Reader

É uma classe abstrata sendo igual à InputStream, é voltada para a manipulação de caracteres. Nessa classe não é possível criar objetos diretos dela. Para criar objetos é necessário instanciar uma das subclasses concretas para ter o acesso à funcionalidade especificada por Reader. Para obter maiores informações acesse o link http://docs.oracle.com/javase/1.4.2/docs/api/java/io/Reader.html.

Writer

É uma classe abstrata que escreve stream de caracteres. Os únicos métodos que uma subclasse writer deve implementar são: write(char [], int, int), flush () e close ().


Figura 3: Subclasses da classe Writer

Buffers

São entidades intermediárias entre duas ou mais entidades que produzem e consomem elementos. No Buffer existe uma área de memória que é utilizada para armazenamento temporário dos elementos que foram produzidos mas ainda não foram consumidos.

Para aprendizado abaixo é mostrado um exemplo do que o código faz a criação e leitura do arquivo declarado dentro do construtor da classe File.

Listagem 3: Criando e escrevendo em um arquivo .txt.

import java.io.File; import java.io.IOException; import java.io.FileWriter; import java.io.FileReader; import java.io.BufferedWriter; import java.io.BufferedReader; class Cria_e_Le_Arquivo { public static void main(String args[]) { File f = new File("ArquivoCriado.txt"); try { FileWriter fw = new FileWriter(f); BufferedWriter bw = new BufferedWriter(fw); bw.write("Esse texto está sendo inserido"); //INSERE UMA NOVA LINHA bw.newLine(); bw.write("Continua sendo inserido em uma nova linha"); bw.newLine(); bw.write("Continua sendo inserido em uma 3ª linha"); bw.flush(); bw.close(); } catch (IOException e) { e.printStackTrace(); } //EFETUANDO A LEITURA try { FileReader fr = new FileReader(f); BufferedReader br = new BufferedReader(fr); String s; //ENQUANTO EXISTE DADOS CONTINUA IMPRIMINDO while ((s = br.readLine()) != null) { System.out.println(s); } } catch (IOException e) { System.out.println("###### Erro: "+e.getMessage()); e.printStackTrace(); } } }

Apenas vale lembrar que quando executado o código mostrado na Listagem 3, é criado um arquivo chamado ArquivoCriado.txt dentro do projeto e com as saídas que foram dadas ao BufferedWriter. Efetue o teste achando esse arquivo e consulte se os valores que foram inseridos no programa são os mesmo que estão no arquivo.

Mais informações acesse os links:

Espero que tenham gostado e até a próxima!


Artigos relacionados