capítulo 10. stream – fluxo i/o arquivos texto java.io.reader java.io.filereader...

35
Stream – Fluxo I/O Manipulação de arquivos texto Capítulo 10

Upload: internet

Post on 22-Apr-2015

106 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 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

Stream – Fluxo I/OManipulação de arquivos texto

Capítulo 10

Page 2: 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

Stream – Fluxo I/O Arquivos texto

java.io.Readerjava.io.FileReaderjava.io.BufferedReaderjava.io.Writerjava.io.FileWriterjava.io.BufferedWriterjava.io.PrintWriter

2

Page 3: 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

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

Page 4: 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

Arquivos texto

4

[Abstract]

Reader

read() : intread(char[]) : intread(char[], int, int) : intskip(long n) : longready() : booleanclose() : void

BufferedReader

readLine() : String

PrintWriter

print(String) : voidprintln(String) : voidprintf(String, Object...) : PrintWriter

BufferedWriter

newLine() : void

FileWriter

FileReader

[Abstract]Writer

write(String) : voidwrite(char[]) : voidflush() : voidclose() : void

Page 5: 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

Arquivos texto java.io.Reader

Classe abstrata que representa alguma fonte de dados em formato texto.

java.io.FileReader Representa algum arquivo texto

de onde podemos ler dados caracter a caracter.

java.io.BufferedReader Representa alguma fonte de texto

de onde podemos ler linha a linha

java.io.Writer Classe abstrata que representa algum

destino de dados em formato texto.

java.io.FileWriter Representa algum arquivo texto onde

podemos escrever caracter a caracter.

java.io.BufferedWriter Representa uma saída de texto onde

podemos escrever linha a linha.

java.io.PrintWriter Representa uma saída de texto onde

podemos escrever linha a linha, inclusive dados formatados.

5

Page 6: 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.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.

6

J a v a é \n D i v e r t i d o

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

Page 8: 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.Reader

Reader reader = new FileReader(“C:\\carta.txt”);char[] dados = new char[4];dados[0] = (char) reader.read();dados[1] = (char) reader.read();dados[2] = (char) reader.read();dados[3] = (char) reader.read();reader.close();String texto = new String(dados);System.out.println(texto);

8

Alguma implementação de Reader

J a v a é \n D i v e r t i d o

Page 9: 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.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

Page 10: 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.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);

10

J a v a é \n D i v e r t i d o

Page 11: 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.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

Page 12: 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.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

Page 13: 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.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.

13

J a v a é \n D i v e r t i d o

Page 14: 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.Reader

Reader reader = new FileReader(“C:\\plan1.xls”);

while (reader.ready()) {System.out.print((char) reader.read());

}

reader.close();

14

Page 15: 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.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

Page 16: 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.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

Page 17: 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.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

Page 18: 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.Writer Um Writer (também chamado de escritor)

representa uma entidade ou dispositivo para onde podemos empurrar informações de texto.

18

p a c tI m a

Page 19: 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.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

Page 20: 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.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); // Jwriter.write(97); // awriter.write(118); // vwriter.write(97); // awriter.close();. . .

20

Alguma implementação de OutputStream

Page 21: 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.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();

21

Alguma implementação de OutputStream

Page 22: 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.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();

22

Posição inicial Quantidade de bytes

Page 23: 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.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();writer.write(...);writer.write(...);writer.flush();writer.write(...);writer.close();

23

Esvazia o cache forçando os dados em memória para saída

Page 24: 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.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

Page 25: 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.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

Page 26: 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.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

Page 27: 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.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

Page 28: 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 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

Page 29: 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

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

Page 30: 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

Exercício (continuação)

Comando “Novo” Limpa a caixa de texto

30

Page 31: 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

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

Page 32: 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

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

Page 33: 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

Exercício (fim)

Sair Fecha a janela com o método dispose()

33

Page 34: 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

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

Page 35: 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

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