O pacote java.io Material baseado na apostila FJ-11: Java e Orientação a Objetos do curso Caelum, Ensino e Inovação, disponível para download em http://www.caelum.com.br/apostilas/ 1 Objetivos • ler e escrever bytes, caracteres e Strings de/para a entrada e saída padrão; • ler e escrever bytes, caracteres e Strings de/para arquivos; • utilizar buffers para agilizar a leitura e escrita através de fluxos; • usar Scanner e PrintStream. 2 InputStream, InputStreamReader e BufferedReader • Diagrama de Classes 3 Lendo um byte de um arquivo • Problema com esse código Cenário: Um arquivo codificado usando a tabela de caracteres UTF-8, contendo um ç como primeiro caracter. A saída do programa seria: Ã 4 Lendo um caracter de um arquivo • Para recuperar um caractere com o encoding correto, usamos uma instância de um Reader • No mesmo cenário do slide anterior, este programa imprimiria agora corretamente um ç. 5 BufferedReader • Observe que a classe Reader tem somente um método read() que retorna um inteiro. Como fazer para ler um String? Poderíamos concatenar os caracteres lidos e formar Strings, mas isso daria muito trabalho. Uma solução melhor é usar a classe BufferedReader que “decora” um Reader com a capacidade de ler Strings. 6 Composição de Classes • A composição de classes que montamos até agora tem a forma: 7 Lendo um arquivo para a saída padrão • Nosso programa anterior lia apenas a primeira linha do arquivo. Vamos modificar o programa com o uso de um laço, para ler todo o arquivo para a saída padrão. 8 InputStream e Polimorfismo • O programa anterior poderia ser facilmente modificado de modo a ler streams de bytes de qualquer InputStream 9 A analogia para a escrita 10 Diagrama de Classes 11 Escrevendo Strings em um arquivo de saída • O método write() do BufferedWriter não insere os caracteres de quebra de linha. Para isso você pode usar o método newLine(). 12 Serializando objetos • Objetos podem ser serializados para serem persistidos ou para serem transmitidos de uma camada à outra da aplicação. • Uma “espiada” no arquivo de saída: 13 Desserializando objetos • Objetos podem ser desserializados. O processo de desserialização instancia um novo objeto e inicializa os atributos com os valores lidos do stream de entrada. 14 As classes Scanner e PrintStream • A partir da versão 5 do Java temos a classe Scanner, especializada em ler InputStreams. • Com a classe Scanner, não é mais necessário criar instâncias de Readers ou BufferedReaders. • A classe Scanner, combinada com a classe PrintStream (especializada em escrever em OutputStreams) facilita muito as operações de entrada a partir de arquivos ou teclado e saída em arquivos. 15 A classe Scanner 16 A classe PrintStream 17 As classes Scanner e PrintStream • Exemplo: Cópia do conteúdo de um arquivo para a saída padrão 18 As classes Scanner e PrintStream • Exemplo: Cópia de Strings lidas do teclado para um arquivo de saída 19