JAVA I/O (Entrada e Saída em JAVA)

Click here to load reader

  • date post

    08-Jan-2016
  • Category

    Documents

  • view

    22
  • download

    0

Embed Size (px)

description

JAVA I/O (Entrada e Saída em JAVA). Prof. Alexandre Monteiro Recife. Contatos. Prof. Guilherme Alexandre Monteiro Reinaldo Apelido: Alexandre Cordel E-mail/ gtalk : [email protected] [email protected] Site: http://www.alexandrecordel.com.br/fbv Celular: (81) 9801-1878. - PowerPoint PPT Presentation

Transcript of JAVA I/O (Entrada e Saída em JAVA)

  • JAVA I/O(Entrada e Sada em JAVA)Prof. Alexandre Monteiro

    Recife

  • ContatosProf. Guilherme Alexandre Monteiro ReinaldoApelido: Alexandre CordelE-mail/gtalk: [email protected] [email protected] Site: http://www.alexandrecordel.com.br/fbvCelular: (81) 9801-1878

  • ObjetivoAo trmino desse captulo, voc ser capaz de:ler e escrever bytes, caracteres e Strings de/para a entrada e sada padro;ler e escrever bytes, caracteres e Strings de/para arquivos;utilizar buffers para agilizar a leitura e escrita atravs de fluxos;usar Scanner e PrintStream.

  • Classes java.io Vamos passar a conhecer APIs do Java. java.io e java.util Possuem as classes que voc mais comumente vai usar, no importando se seu aplicativo desktop, web, ou mesmo para celulares.

  • Dicas ImportantesNo se preocupe em decorar nomes. Atenha-se em entender como essas classes esto relacionadas e como elas esto tirando proveito do uso de interfaces, polimorfismo, classes abstratas e encapsulamento. Lembre-se de usar a documentao (javadoc) durante o contato com esses pacotes.

  • OO em java.ioA ideia atrs do polimorfismo no pacote java.io de utilizar fluxos de entrada (InputStream) e de sada (OutputStream) Para toda e qualquer operao, seja ela relativa a um arquivo, a um campo blob do banco de dados, a uma conexo remota via sockets, ou at mesmo s entrada e sada padro de um programa (normalmente o teclado e o console).As classes abstratas InputStream e OutputStream definem, respectivamente, o comportamento padro dos fluxos em Java: em um fluxo de entrada, possvel ler bytes e, no fluxo de sada, escrever bytes.

  • InputStream, InputStreamReader e BufferedReader Para ler um byte de um arquivo, vamos usar o leitor de arquivo, o FileInputStream. Para um FileInputStream conseguir ler um byte, ele precisa saber de onde ele dever ler (caminho onde est o arquivo). Essa informao to importante que quem escreveu essa classe obriga voc a passar o nome do arquivo pelo construtor: sem isso o objeto no pode ser construdo.

  • InputStream, InputStreamReader e BufferedReader A classe InputStream abstrata e FileInputStream uma de suas filhas concretas. FileInputStream vai procurar o arquivo no diretrio em que a JVM fora invocada. Alternativamente voc pode usar um caminho absoluto.

  • IOExceptionQuando trabalhamos com java.io, diversos mtodos lanam IOException, que uma exception do tipo checked - o que nos obriga a trat-la ou declar-la. Nos exemplos aqui, estamos declarando IOException atravs da clausula throws do main apenas para facilitar o exemplo. Caso a exception ocorra, a JVM vai parar, mostrando a stacktrace. Esta no uma boa prtica em uma aplicao real: trate suas exceptions para sua aplicao poder abortar elegantemente.

  • Exemplo Tratando IOExceptionimport java.io.*;public class MostraArquivo {public static void main(String[] args) {InputStream is = null; int i = -1;try {is = new FileInputStream("c:\\teste.txt");} catch (FileNotFoundException e) {System.out.println("Arquivo no encontrado !!");}do {try {i = is.read();} catch (IOException e) {System.out.println("Arquivo no pode ser lido !!");}if (i != -1)System.out.print((char) i);} while (i != -1);}}

  • Recuperando caracteres (Entrada)Para recuperar um caractere, precisamos traduzir os bytes com o encoding dado para o respectivo cdigo unicode, isso pode usar um ou mais bytes. Escrever esse decodificador muito complicado, quem faz isso por voc a classe InputStreamReader.

  • Recuperando caracteres (Entrada)O construtor de InputStreamReader pode receber o encoding a ser utilizado como parmetro, se desejado, tal como UTF-8 ou ISO-8859-1. Comparem!!!InputStreamReader filha da classe abstrata Reader, que possui diversas outras filhas - so classes que manipulam chars.

  • Reader x BufferedReaderApesar da classe abstrata Reader j ajudar no trabalho de manipulao de caracteres, ainda seria difcil pegar uma String. A classe BufferedReader um Reader que recebe outro Reader pelo construtor e concatena os diversos chars para formar uma String atravs do mtodo readLine():

  • Decorator PatternComo o prprio nome diz, essa classe l do Reader por pedaos (usando o buffer) para evitar realizar muitas chamadas ao sistema operacional. Voc pode at configurar o tamanho do buffer pelo construtor. essa a composio de classes que est acontecendo.Esse padro de composio bastante utilizado e conhecido. o Decorator Pattern.

  • Exemplo 1No exemplo abaixo, lemos apenas a primeira linha do arquivo. O mtodo readLine() devolve a linha que foi lida e muda o cursor para a prxima linha. Caso ele chegue ao fim do Reader (no nosso caso, fim do arquivo), ele vai devolver null. Ento, com um simples lao, podemos ler o arquivo por inteiro:

  • Exemplo 1

  • Lendo Strings do Teclado (Entrada)Com um passe de mgica, passamos a ler do teclado em vez de um arquivo, utilizando o System.in, que uma referncia a um InputStream o qual, por sua vez, l da entrada padro.

  • Lendo Strings do TecladoApenas modificamos a quem a varivel is est se referindo. Podemos receber argumentos do tipo InputStream e ter esse tipo de abstrao: no importa exatamente de onde estamos lendo esse punhado de bytes, desde que a gente receba a informao que estamos querendo. Vejamos:

  • Lendo Strings do TecladoRepare que a ponta da direita poderia ser qualquer InputStream, seja ObjectInputStream, AudioInputStream, ByteArrayInputStream, ou a nossa FileInputStream. Polimorfismo! Ou voc mesmo pode criar uma filha de InputStream, se desejar.

  • Escrevendo Caracteres (Sada)Como voc pode imaginar, escrever em um arquivo o mesmo processo:

  • Escrevendo Caracteres (Sada)Como voc pode imaginar, escrever em um arquivo o mesmo processo.O mtodo write do BufferedWriter no insere o(s) caractere(s) de quebra de linha. Para isso, voc pode chamar o mtodo newLine().

  • Scanner e PrintStreamA partir do Java 5, temos a classe java.util.Scanner, que facilita bastante o trabalho de ler de um InputStream. Alm disso, a classe PrintStream possui um construtor que j recebe o nome de um arquivo como argumento. Dessa forma, a leitura do teclado com sada para um arquivo ficou muito simples:

  • Scanner e PrintStreamA classe Scanner do pacote java.util. Ela possui mtodos muito teis para trabalhar com Strings, em especial, diversos mtodos j preparados para pegar nmeros e palavras j formatadas atravs de expresses regulares. Fica fcil parsear um arquivo com qualquer formato dado.

  • Scanner e OutputStreamSystem.outO atributo out da classe System do tipo PrintStream (e, portanto, um OutputStream).

  • System.outimport java.io.*;public class MostraArquivo {public static void main(String[] args) {InputStream is = null; int i = -1;try {is = new FileInputStream("c:\\teste.txt");} catch (FileNotFoundException e) {System.out.println("Arquivo no encontrado !!");}do {try {i = is.read();} catch (IOException e) {System.out.println("Arquivo no pode ser lido !!");}if (i != -1)System.out.print((char) i);} while (i != -1);}}

  • Exerccio de Casa 1Faa um programa que cria um backup do contedo de um arquivo texto (.txt), que contenha vrias linhas.- Use o BufferedWriter ou o PrintStream. Este ltimo de mais fcil manipulao.- Se for usar o BufferedWriter, fazemos assim parar abri-lo:OutputStream os = new FileOutputStream("saida.txt"); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); Dentro do loop de leitura do teclado use bw.write(x), onde x a linha que voc leu. Use bw.newLine() para pular de linha. No trmino do loop, dar um bw.close(). Voc pode seguir o modelo:while (entrada.hasNextLine()) { String linha = entrada.nextLine(); bw.write(linha); bw.newLine(); } bw.close();

  • Exerccio de Casa 2Altere o programa para ele virar um pequeno editor: l do teclado e escreve em arquivo. Repare que a mudana a ser feita mnima!

  • RefernciasDeitel. Java como Programar.