Capítulo 8 Ficheiros de texto Ler e escrever em ficheiros de texto Ler ficheiros de texto • A forma mais simples de ler texto é usar a classe Scanner • Para ler de um ficheiro do disco, cria-se um objecto da classe FileReader • Depois, usa-se o FileReader para criar um objecto Scanner FileReader reader = new FileReader("input.txt"); Scanner in = new Scanner(reader); • Para ler a informação, utilizam-se os métodos da classe Scanner: • next, nextLine, nextInt e nextDouble Introdução à Programação 2007/08 A. Lopes Escrever ficheiros de texto • Para escrever num ficheiro, cria-se um objecto da classe PrintWriter PrintWriter out = new PrintWriter("output.txt"); • Se o ficheiro já existe, o seu conteúdo é apagado antes das novas operações de escrita. Se o ficheiro não existe, então é criado um ficheiro vazio • Usa-se print e println para escrever num objecto PrintWriter out.println(29.95); out.println("Hello, World!"); • O ficheiro deve ser fechado após o respectivo processamento. Senão, a informação pode não ser escrita no ficheiro out.close(); Introdução à Programação 2007/08 A. Lopes Um exemplo • Ler todas as linhas de um ficheiro e enviar para o ficheiro de saída, precedidas pelo número de linha (o programa pode ser usado para numerar linhas em ficheiros .java) Mary had a little lamb Whose fleece was white as snow. And everywhere that Mary went, The lamb was sure to go! /* /* /* /* Introdução à Programação 1 2 3 4 */ */ */ */ Mary had a little lamb Whose fleece was white as snow. And everywhere that Mary went, The lamb was sure to go! 2007/08 A. Lopes Ficheiro LineNumberer.java import import import import java.io.FileReader; java.io.IOException; java.io.PrintWriter; java.util.Scanner; public class LineNumberer { ! public static void main(String[] args) { ! ! Scanner console = new Scanner(System.in); ! ! System.out.print("Input file: "); ! ! String inputFilename = console.next(); ! ! System.out.print("Output file: "); ! ! String outputFilename = console.next(); try ! ! { ! ! ! FileReader reader = new FileReader(inputFilename); ! ! ! Scanner in = new Scanner(reader); ! ! ! PrintWriter out = new2007/08 PrintWriter(outputFilename); Introdução à Programação A. Lopes Ficheiro LineNumberer.java ! ! ! int lineNumber = 1; ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! out.close(); ! } ! catch (IOException exception) ! { ! ! System.out.println("Error in file processing: " + exception); ! } } } ! ! ! ! ! ! while (in.hasNextLine()) { ! String line = in.nextLine(); ! out.println("/* " + lineNumber + " */ " + line); ! lineNumber++; } Introdução à Programação 2007/08 A. Lopes Caixas de diálogo uma caixa de diálogo JFileChooser Introdução à Programação 2007/08 A. Lopes Caixas de diálogo JFileChooser chooser = new JFileChooser(); FileReader reader = null; Scanner in; if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { File selectedFile = chooser.getSelectedFile(); reader = new FileReader(selectedFile); in = new Scanner(reader); ... } Informação adicional em: http://java.sun.com/docs/books/tutorial/uiswing/components/ filechooser.html Introdução à Programação 2007/08 A. Lopes Manipulação de texto • Texto: sequência de caracteres • por exemplo, o número 12,345 é guardado com os caracteres '1' '2' ',' '3' '4' '5' • Utilizam-se objectos FileReader e FileWriter para processar leitura e escrita • Para ler: FileReader reader = new FileReader("input.txt"); // ... char ch = (char) reader.read(); • Para escrever: FileWriter writer = new FileWriter("output.txt"); // ... writer.write(ch); Introdução à Programação 2007/08 A. Lopes Ler carácter a carácter • Utilizar o método read de FileReader para ler um único carácter • devolve o próximo carácter como um int • ou o carácter -1 no fim do ficheiro FileReader reader = ...; int next; char c; while ((next = reader.read()) != -1) { c = (char) next; …. } Introdução à Programação 2007/08 A. Lopes Ficheiros outros conceitos a estudar no futuro • Para além do formato texto, existe também o formato binário • Há a possibilidade de o acesso a ficheiros ser aleatório Acesso sequencial Acesso aleatório Introdução à Programação 2007/08 A. Lopes