Programação II – Java Streams Christopher Burrows Java Streams - Introdução As aplicações informáticas consistem em trocas de dados entre duas ou mais fontes/destinos. As Streams servem para representar a fonte ou destino dos dados dentro de uma aplicação. Java Streams - Introdução Existem duas classes das Streams, a partir das quais todas derivam: – – InputStream (para entrada); OutputStream (para saída); As Streams têm suporte para vários tipos de dados. (cada um com Input e Output) Java Streams – Tipos de Dados Byte Streams; Character Streams; Buffered Streams; Data Streams; Object Streams; Java Streams – Byte Streams Permitem ler sequências de bytes, sem haver a noção de qual é o tipo de dados que consistem. Só devem ser utilizados com dados essencialmente binários (imagens, som, etc.). Servem de base para todos os outros tipos de Streams. Java Streams – Byte Streams public static void main(String[] args) throws IOException, FileNotFoundException { FileInputStream fis = new FileInputStream(“in.txt”); FileOutputStream fos = new FileOutputStream(“out.txt”); int temp; while((temp = fis.read()) != -1) { out.write(temp); } fis.close(); fos.close(); } Java Streams – Character Streams Utiliza-se para ler/escrever sequências de caracteres em Unicode. Funcionam da mesma forma que os Byte Streams. São preferiveis quando se trata de texto, uma vez que podem representar qualquer caracter no set Unicode. Java Streams – Character Streams Ao contrário dos Streams de bytes e todos os outros que trabalham com formatos de binários, os Streams de caracteres, que trabalham com formatos de texto, utilizam o FileReader e o FileWriter em vez do InputStream e o OutputStream. Java Streams – Character Streams public static void main(String[] args) throws IOException { FileReader fr = new FileReader(“in.txt”); FileWriter fw = new FileWriter(“out.txt”); int c; while((c = fr.read()) != -1) { fw.write(c); } fr.close(); fw.close(); } Java Streams – Buffered Streams Os Buffers são espaços reservados na memória. Tornam o sistema mais eficiente que os Streams anteriores, uma vez que não é necessário aceder ao ficheiro sempre que se quer ler algo. Java Streams – Buffered Streams public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileInputStream(“in.txt”)); BufferedWriter bw = new BufferedWriter(new FileOutputStream(“out.txt”)); while((br.ready()) { bw.write(br.readLine()); bw.newLine(); } br.close(); bw.close(); } Java Streams – Data Streams Permitem ler/escrever dados de um tipo primitivo (int, double, float, boolean, etc...); Atenção: este tipo de Streams não pode ser usado com Objectos (Strings, BigInteger, etc...); Java Streams – Data Streams public static void main(String[] args) throws IOException { DataOutputStream dos = new DataOutputStream(new FileOutputStream("dataStream.txt")); for(int i = 0; i < 10; i++) dos.writeInt(i); DataInputStream dis = new DataInputStream(new FileInputStream("dataStream.txt")); try { while(true) System.out.println(dis.readInt()); } catch (EOFException eof) { System.out.println("Fim do ficheiro!"); } } Java Streams – Object Streams Do mesmo modo que os Data Streams são utilizados com dados primitivos, existem os Object Streams para objectos. Para se poder armazenar um Objecto num ficheiro, este deve implementar o interface Serializable. Java Streams – Object Streams public static void main(String[] args) throws IOException, ClassNotFoundException { String ola = new String("olá!"); FileOutputStream fos = new FileOutputStream("objectStream.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(ola); oos.close(); fos.close(); FileInputStream fis = new FileInputStream("objectStream.txt"); ObjectInputStream ois = new ObjectInputStream(fis); System.out.println((String)ois.readObject()); } Java Streams – Object Streams System.out.println((String)ois.readObject()); Quando se armazenam Objectos num ficheiro, a classe do Objecto a que se refere não é especificada, pelo que quando se está a ler, é necessário indicá-lo. Java Streams É importante fechar sempre uma Stream depois de utilizada, para evitar fugas de memória. nomeDaStream.close(); Java Streams - Exercicio Aproveitando a classe Pessoa da aula anterior, criar uma nova classe MainStreams (runnable) que crie um objecto do tipo Pessoa e o armazene num ficheiro. De seguida, ler o objecto do ficheiro e imprimir o primeiro e último nome e o número do BI.