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.
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
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:
- 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!