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:

  • Manipulação de entrada e saída de bytes – transferência de dados binários;
  • Manipulação de entrada e saída de caracteres – transferência de textos;
  • Buffers - melhoram a eficiência da velocidade de leitura e escrita;
  • Conversão de formatos – texto e formato interno de dados binários.

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.

Hierarquia da classe InputStream

Figura 1: Hierarquia da classe InputStream

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

  • ByteArrayInputStream – Valores são originários de um arranjo de bytes;
  • FileInputStream – Bytes com originalidade de um arquivo.
  • FilterInputStream – Filtra os dados de um InputStream.
  • BufferedInputStream – Faz a leitura de grandes volumes de bytes que armazena em um buffer interno.
  • DataInputStream – Permite a leitura de representações binárias dos tipos primitivos de Java.
  • ObjectInputStream – Oferece o método readObject para a leitura de objetos que foram serializados para um ObjectOutputStream.
  • PipedInputStream – Faz a leitura de um pipe de bytes cuja origem está associada a um objeto PipedOutputStream.

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

Subclasses OutputStream

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 ().

Subclasses da classe Writer

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:

  • http://docs.oracle.com/javase/1.4.2/docs/api/java/io/File.html
  • http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InputStream.html

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