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 O pacote java.io • Utilizar fluxos de entrada (InputStream) e de saída (OutputStream) para toda e qualquer operação. • • Classes abstratas InputStream e OutputStream • • • InputStream: fluxo de entrada, leitura de bytes OutputStream: fluxo de saída, escrita de bytes. Algumas especializações de InputStream • • arquivo, conexão via sockets, entrada e saída padrão, etc AudioInputStream, ByteArrayInputStream, FileInputStream. Algumas especializações de OutputStream • ByteArrayOutputStream, FileOutputStream, PipedOutputStream. 3 Lendo um byte de um arquivo class TestaEntrada { public static void main(String[] args) throws IOException { InputStream is; is = new FileInputStream("arquivo.txt"); int b = is.read(); } } • Abre um arquivo no diretório onde o java foi invocado. 4 Byte streams • Usadas para fazer entrada e saída de bytes (8 bits). • É a forma mais básica de entrada/saída. • Não deve ser usada para caracteres. • Há também streams para tipos mais elaborados de dados. 5 Copiando Arquivo byte por byte class CopiaBytes { public static void main(String[] args) throws IOException { int c; FileInputStream ent = null; FileOutputStream sai = null; try { ent = new FileInputStream("arquivo.txt"); sai = new FileOutputStream("saida.txt"); } while ((c = ent.read()) != -1) sai.write(c); // Continua no próximo slide 6 Copiando Arquivo byte por byte // Não esquecer de fechar arquivos abertos finaly { if ( ent != null ) ent.close(); if ( sai != null) sai.close(); } } } 7 Character Stream • Java armazena caracteres utilizando Unicode • Uma Character Stream automaticamente traduz o formato interno para o formato local (e vice-versa). • Nos países ocidentais, normalmente, uma externsão de 8 bits de ASCII • Todas classes Character Stream são especializações de Reader ou de Writer (classes abstratas). • Como com as Byte Streams há várias classes especiallizadas, por exemplo: FileReader e FileWriter 8 Character Streams e Byte Streams • Character Streams são usadas como um complemento para Bytes Streams • Character Streams usam Byte Stream para fazer a entrada e saída física • Character Streams fazem a transformação de bytes em caracteres (e vice-versa) 9 Lendo um caractere de um arquivo class TestaEntrada { public static void main(String[] args) throws IOException { InputStream is; InputStreamReader isr; is = new FileInputStream("arquivo.txt"); isr = new InputStreamReader(is); int b = isr.read(); } } 10 FileReader e FileWriter class CopiaBytes { public static void main(String[] args) throws IOException { int c; FileReader ent = null; FileWriter sai = null; try { ent = new FileReader("arquivo.txt"); sai = new FileWriter("saida.txt"); } while ((c = ent.read()) != -1) sai.write(c); // Continua no próximo slide 11 Copiando Arquivo byte por byte finaly { if ( ent != null ) ent.close(); if ( sai != null) sai.close(); } } } 12 Entrada e Saída Orientada a linha • Caracteres muitas vezes ocorrem em unidades maiores que caracteres isolados. • Uma unidade comum é a linha • • Terminadores de linha • • • • Uma string terminada com um caractere de terminação de linha Carriage-return (“\r”) Line-feed (“\n”) Ambos (“\r\n”) Buffered Streams podem ser usadas para leitura e escrita orientadas a linha 13 Buffered Streams • Acesso ao disco é uma operação demorada • Ler e escrever byte a byte ou caracter a caracter é muito pouco eficiente • É comum fazer a leitura e a escrita de grandes porções de dados • Os dados são armazenados temporariamente em áreas de memória (buffer) • • • A escrita só é feita quando esta área está cheia ou ao fechar o arquivo. A leitura só é feita quanto esta área está vazia. O buffer é transparente para a aplicação 14 Encadeamento das classes (leitura) 15 Lendo todas as Linha InputStream is; InputStreamReader isr; BufferedReader br; is = new FileInputStream("arquivo.txt"); isr = new InputStreamReader(is, "ISO-8859-1"); br = new BufferedReader(isr); String str = br.readLine(); while (str != null) { System.out.println(str); str = br.readLine(); } br.close(); 16 Streams Padrão • Três streams padrão • • • System.in System.out System.err Entrada padrão (teclado) Saída padrão (console) Saída padrão de erros (console) • Estes objetos são definods automaticamente e não precisam ser abertos • System.out e System.err são objetos PrintStream 17 Lendo do teclado InputStreamReader isr; BufferedReader br; isr = new InputStreamReader(System.in); br = new BufferedReader(isr); try { String str = br.readLine(); while (str != null) { System.out.println(str); str = br.readLine(); } br.close(); } catch (IOException e) { System.out.println(e.getMessage()); } 18 Encadeamento das classes (escrita) 19 Escrevendo uma linha no arquivo OutputStream os; OutputStreamWriter osw; BufferedWriter bw; os = new FileOutputStream("saida.txt"); osw = new OutputStreamWriter(os); bw = new BufferedWriter(osw); bw.write("escrevendo no arquivo"); bw.newLine(); // muda de linha bw.close(); • Atributo opcional boolean em FileOutputStream para append 20 FileReader e FileWriter String lin; FileReader entFile = null; FileWriter saiFile = null; BufferedReader ent = new BufferedReader(entFile); PrintWriter sai = new PrintWriter(saiFile); while ((lin = ent.readLine()) != null) { System.out.println(lin); sai.println(lin); } entFile.close(); saiFil.close(); 21 Scanner e PrintStream • A partir do java 1.5 Scanner s; PrintStream ps; s = new Scanner(System.in); try { ps = new PrintStream("arquivo.txt"); while ( s.hasNextLine() ) { ps.println( s.nextLine() ); } ps.close(); } catch (IOException e) { System.out.println(e.getMessage()); } 22 Classe File • Não é uma classe Stream • É uma representação abstrata de arquivos e diretórios 23 Classe File File(String pathname) Construtor. boolean createNewFile() Cria um arquivo vazio. boolean delete() Remove o arquivo String getPath() Obtem o caminho boolean isDirectory() Testa se é um diretório boolean isFile() Testa se é um arquivo. String[] list(FilenameFilter filter) Nomes de arquivos no diretório. boolean mkdir() Cria um novo diretório. 24 Listando um diretório String fileName = args[0]; File fn = new File(fileName); System.out.println("Nome: " + fn.getName()); if (fn.isDirectory()) { String content[] = fn.list(); System.out.println("Conteúdo do Diretório:"); for (int i = 0; i < content.length; i++) { System.out.println(content[i]); } 25