Capítulo 10
Stream – Fluxo I/O

Arquivos texto
 java.io.Reader
 java.io.FileReader
 java.io.BufferedReader
 java.io.Writer
 java.io.FileWriter
 java.io.BufferedWriter
 java.io.PrintWriter
2
Arquivos texto

Um arquivo texto é um arquivo que contém
informações legíveis e editáveis por quaisquer
editores de texto, como o Notepad, Edit, VI e outros.

Um arquivo texto pode possuir qualquer extensão,
mas geralmente utilizamos a extensão TXT.

Através do pacote java.io podemos utilizar classes
do Java para leitura e gravação de texto em
arquivos deste tipo.
3
Arquivos texto
[Abstract]
Reader
read() : int
read(char[]) : int
read(char[], int, int) : int
skip(long n) : long
ready() : boolean
close() : void
FileReader
BufferedReader
readLine() : String
FileWriter
[Abstract]
Writer
write(String) : void
write(char[]) : void
flush() : void
close() : void
BufferedWriter
newLine() : void
PrintWriter
print(String) : void
println(String) : void
printf(String, Object...) : PrintWriter
4
Arquivos texto

java.io.Reader

 Classe abstrata que representa
 Classe abstrata que representa algum
alguma fonte de dados em
formato texto.
destino de dados em formato texto.


java.io.FileReader

java.io.FileWriter
 Representa algum arquivo texto onde
 Representa algum arquivo texto
de onde podemos ler dados
caracter a caracter.
java.io.Writer
podemos escrever caracter a caracter.

java.io.BufferedWriter
 Representa uma saída de texto onde
java.io.BufferedReader
podemos escrever linha a linha.
 Representa alguma fonte de texto
de onde podemos ler linha a linha

java.io.PrintWriter
 Representa uma saída de texto onde
podemos escrever linha a linha,
inclusive dados formatados.
5
java.io.Reader

Um Reader (também chamado de leitor) representa um montante
de informações em formato texto enfileirados de onde podemos
capturar seus dados caracter a caracter.

Algumas implementações desta classe podem também capturar
dados linha a linha.

Uma instância da classe Reader possui um posicionador
apontando para algum de seus caracteres.

A cada leitura realizada o posicionador captura o caracter e avança
para o próximo, tornando-o disponível para nova leitura.
J a v a
é \n D i v e r t i d o
6
java.io.Reader

int read()
 Realiza a leitura do caracter da vez retornando um
número inteiro a ser convertido para char e avança
para o próximo caracter.
 Caso o posicionador estiver apontando para depois
do último caracter, este método retorna o valor -1.
7
java.io.Reader
Reader reader = new FileReader(“C:\\carta.txt”);
char[] dados = new char[4];
dados[0] = (char) reader.read();
Alguma implementação
dados[1] = (char) reader.read();
de Reader
dados[2] = (char) reader.read();
dados[3] = (char) reader.read();
reader.close();
String texto = new String(dados);
System.out.println(texto);
J a v a
é \n D i v e r t i d o
8
java.io.Reader

int read(char[])
 Principal método da classe Reader.
 Realiza a leitura de diversos caracteres de uma só
vez armazenando-os no array especificado.
 Após realizar a leitura este método retorna um
número inteiro informando quantos caracteres foram
realmente lidos.
9
java.io.Reader
Reader reader = new FileReader(“C:\\carta.txt”);
char[] dados = new char[4];
/* Realiza a leitura dos próximos 4 caracteres. */
int quant = reader.read(dados);
reader.close();
String texto = new String(dados);
System.out.println(texto);
J a v a
é \n D i v e r t i d o
10
java.io.Reader

int read(char[], int, int)
 Realiza a leitura de diversos caracteres de uma
só vez armazenando-os no array especificado e
nas posições especificadas.
 Após realizar a leitura este método retorna um
número inteiro informando quantos caracteres
foram realmente lidos.
11
java.io.Reader

long skip(long)
 Avança o posiciondor de leitura sem capturar
nenhuma informação do reader.
Reader reader = new FileReader(“C:\\carta.txt”);
char[] dados = new char[35];
reader.read(dados); /* Lê 35 caracteres. */
reader.skip(20);
/* “Pula” 20 posições. */
reader.read(dados); /* Lê mais 35 caracteres. */
reader.close();
12
java.io.Reader

boolean ready()
 Verifica se na posição atual há algum caracter
disponível para leitura.
 Retorna true quando há algum caracter ou false
quando o posicionador estiver apontando para
após o último caracter do arquivo.
J a v a
é \n D i v e r t i d o
13
java.io.Reader
Reader reader = new FileReader(“C:\\plan1.xls”);
while (reader.ready()) {
System.out.print((char) reader.read());
}
reader.close();
14
java.io.Reader

void close()
 Encerra a entrada de texto liberando o recurso (arquivo ou
outra origem de dados) tornando-o disponível para utilização
por outros programas do sistema operacional.
 Este método deve ser executado sempre que terminarmos a
utilização do reader.
Reader reader = new FileReader(“C:\\carta.txt”);
...
...
reader.close();
15
java.io.FileReader

Uma simples implementação de Reader que lê dados
caracter a caracter a partir de um arquivo texto.

Ao instanciar um FileReader devemos especificar o caminho
absoluto ou relativo do arquivo desejado.
Reader reader1 = new FileReader(“C:\\temp\\carta.txt”);
Reader reader2 = new FileReader(“docs\\rascunho.txt”);
...
...
reader1.close();
reader2.close();
16
java.io.BufferedReader

Outra implementação de Reader que pode ler dados linha a
linha a partir de algum outro reader já instanciado.

Seu método mais utilizado é o readLine() que retorna uma
linha de texto inteira a partir do reader especificado.
BufferedReader reader =
new BufferedReader(new FileReader(“C:\\carta.txt”));
while (reader.ready()) {
System.out.println(reader.readLine());
}
reader.close();
17
java.io.Writer

Um Writer (também chamado de escritor)
representa uma entidade ou dispositivo para
onde podemos empurrar informações de texto.
I
m
p
a
c
t
a
18
java.io.Writer

void write(String)
 Método mais utilizado do writer que permite
escrever um string ao final do texto
Writer writer = new FileWriter(“C:\\carta.txt”);
writer.write(“Java é divertido”);
writer.close();
19
java.io.Writer

void write(int)
 Converte o valor especificado para char e
escreve ao final do texto.
Writer writer = new FileWriter(“C:\\carta.txt”);
writer.write(74); // J
writer.write(97); // a
writer.write(118); // v
Alguma implementação
writer.write(97); // a
de OutputStream
writer.close();
...
20
java.io.Writer

void write(char[])
 Adiciona um array de caracteres ao final do texto.
char[] conteudo = { ‘J’, ‘a’, ‘v’, ‘a’, ‘ ’, ‘é’, ‘ ’, ‘d’, ‘i’, ‘v’, ‘e’, ‘r’, ‘t’,
‘i’, ‘d’, ‘o’ };
Writer writer = new FileWriter(“C:\\carta.txt”);
writer.write(conteudo);
writer.close();
Alguma implementação
de OutputStream
21
java.io.Writer

void write(char[], int, int)
 Adiciona um trecho de array de caracteres ao
final do texto.
char[] conteudo = {‘J’, ‘a’, ‘v’, ‘a’, ‘ ’, ‘é’, ‘ ’, ‘d’, ‘i’, ‘v’, ‘e’, ‘r’, ‘t’,
‘i’, ‘d’, ‘o’ };
Writer writer = new FileWriter(“C:\\carta.txt”);
writer.write(conteudo, 7, 9);
writer.close();
Posição inicial
Quantidade de bytes
22
java.io.Writer

void flush ()
 Obriga o envio de dados em cache para seu
destino.
Writer writer = new FileWriter(“C:\\carta.txt”);
writer.write(...);
writer.write(...);
writer.flush();
Esvazia o cache forçando os
writer.write(...);
dados em memória para saída
writer.write(...);
writer.flush();
writer.write(...);
writer.close();
23
java.io.Writer

void close()
 Encerra a saída de texto liberando o recurso (arquivo ou
outro meio de gravação) tornando-o disponível para
utilização por outros programas do sistema operacional.
 Este método obriga o texto a realizar o flush de todos os
dados que porventura ainda estejam em cache.
Writer writer = new FileWriter(“C:\\carta.txt”);
writer.write(...);
writer.write(...);
writer.write(...);
writer.close();
24
java.io.FileWriter

Uma simples implementação de Writer que escreve texto em
um arquivo.

Ao instanciar um FileWriter devemos especificar o caminho
absoluto ou relativo do arquivo desejado.

No exemplo abaixo, se o arquivo informado já existir, todo o
seu conteúdo será eliminado após a instanciação.
Writer writer = new FileWriter(“C:\\carta.txt”);
...
writer.close();
25
java.io.FileWriter

Ao instanciar um FileWriter podemos informar que seus
dados serão “appendados” (escritos ao final do texto já
existente).

Isto evita que o arquivo seja limpo após a instanciação:
Writer writer = new FileWriter(“C:\\carta.txt”, true);
...
writer.close();
26
java.io.BufferedWriter

Outra implementação de Writer que possui o método
adicional newLine() utilizado para escrever a “quebra de
linha”.

Um BufferedWriter deve ser instanciado a partir de algum
outro Writer:
BufferedWriter writer =
new BufferedWriter(new FileWriter(“C:\\carta.txt”));
writer.write(“Linha 1”);
writer.newLine();
writer.write(“Linha 2”);
writer.close();
27
java.io.PrintWriter

Uma sofisticada implementação de Writer onde podemos
escrever textos e números formatados.

Seus principais métodos são:
 print()
 println()
 printf()
PrintWriter writer = new PrintWriter( “C:\\carta.txt”);
writer.print(“Prêmio ”);
writer.println(“Acumulado”);
writer.printf(“da megasena: %,.2f”, 42500000);
writer.close();
28
Exercício – Editor de Texto em Java

A partir da classe TabajaraEditorFrame
construída pelo Eclipse VE, implemente os
comandos do itens “Novo”, “Abrir”, “Salvar” e
“Sair” conforme especificado no próximo slide
29
Exercício (continuação)

Comando “Novo”
 Limpa a caixa de texto
30
Exercício (continuação)

Comando “Abrir”
 Solicita que o usuário escolha um arquivo através do
comando jfcArquivo.showOpenDialog();
 Se o comando acima retornar o valor da constante
JFileChooser.APPROVE_OPTION, significa que o
usuário selecionou corretamente um arquivo.
Neste caso utilize o comando abaixo para capturar o
arquivo selecionado:
File arquivo = jfcArquivo.getSelectedFile();
Carregue a caixa de texto com todo o conteúdo do
arquivo acima.
31
Exercício (continuação)

Comando “Salvar”
 Solicita que o usuário escolha arquivo existente ou digite
o nome de um novo arquivo através do comando
jfcArquivo.showSaveDialog();
 Se o comando acima retornar o valor da constante
JFileChooser.APPROVE_OPTION, salve todo o conteúdo
da caixa de texto no arquivo obtido pelo comando abaixo:
File arquivo = jfcArquivo.getSelectedFile();
32
Exercício (fim)

Sair
 Fecha a janela com o método dispose()
33
Exercício (desafio 1)

Sobrepor arquivo existente
 Altere o comando “Salvar” para que verifique se o arquivo
selecionado já existe.
 Se sim, pergunte ao usuário se deseja sobrepor o arquivo
selecionado.
 Se o objeto jfcArquivo já possui um arquivo selecionado,
não é necessário exibir novamente a caixa de diálogo
“Salvar”. Desta forma, o nome do arquivo só será
perguntado na primeira vez.
34
Exercício (desafio 2)

Confirmação de fechamento
 Ao fechar a janela verifique se o conteúdo da caixa de texto já
foi salvo.

Dica
 Crie um atributo booleano saved na classe que será utilizada
pelos comandos para lembrar se o texto foi salvo ou não;
 Altere a propriedade defaultCloseOperation da janela para
NOTHING_ON_CLOSE. Desta forma você terá controle sobre o
clique no botão fechar;
 Implemente o evento windowClosing de sua janela para fazer a
verificação antes de fechar a janela.
35
Download

java.io.Reader