Laboratorio de Programación Entrada/Salida (ficheros) Properties Dpto. de Ingeniería de Sistemas Telemáticos http://www.lab.dit.upm.es/~lprg/ febrero 2010 Entrada/Salida febrero 2010 Entrada/Salida 2 1 Ficheros Donde se almacenan datos permanentemente disco duro: C:, $HOME discos removibles: MP-3, discos USB, ... Los datos son montones de bits se pueden interpretar como bytes de 8 en 8 bits (256 valores) byte b se pueden interpretar como caracteres de 16 en 16 bits (65535 valores) char c febrero 2010 Entrada/Salida 3 Ficheros java.io.File File fichero= new File(“nombre”); File fichero= new File(“directorio”, “fichero”); File fichero= new File(directorio, “fichero”); métodos útiles boolean exists() String getName() String getPath() febrero 2010 Entrada/Salida 4 2 Uso de ficheros Lectura 1. 2. 3. Escritura open read read ... close se abre para leer se leen porciones se cierra 1. 2. 3. open write write ... close se abre para escribir se escriben porciones se cierra NOTA: si no se cierra, pueden quedar partes sin guardar Entrada/Salida febrero 2010 5 Lectura de bytes private static final int PORCION= 1024; String ficheroEntrada= ... InputStream entrada = new FileInputStream(ficheroEntrada); byte[] datos = new byte[PORCION]; int nDatos = entrada.read(datos); while (nDatos > 0) { // datos [ 0 a nDatos-1 ] nDatos = entrada.read(datos); } entrada.close(); NOTA: aunque se pide leer una PORCION de datos, puede que se lean menos febrero 2010 Entrada/Salida 6 3 Escritura de bytes String ficheroSalida= ... OutputStream salida = new FileOutputStream(ficheroSalida); while ( ... ) { byte[] datos = ... salida.write(datos); } salida.close(); NOTA: si no se cierra, pueden quedar partes sin guardar Entrada/Salida febrero 2010 7 Lectura de caracteres private static final int PORCION= 1024; String ficheroEntrada= ... Reader entrada = new FileReader(ficheroEntrada); char[] datos = new char[PORCION]; int nDatos = entrada.read(datos); while (nDatos > 0) { // datos [ 0 a nDatos-1 ] nDatos = entrada.read(datos); } entrada.close(); NOTA: aunque se pide leer una PORCION de datos, puede que se lean menos febrero 2010 Entrada/Salida 8 4 Escritura de caracteres String ficheroSalida= ... Writer salida = new FileWriter(ficheroSalida); while ( ... ) { char[] datos = ... salida.write(datos); } salida.close(); NOTA: si no se cierra, pueden quedar partes sin guardar febrero 2010 Entrada/Salida 9 Lectura de Líneas 1. 2. 3. 4. Crear un objeto de la clase File Crear un objeto de la clase FileReader Crear un objeto de la clase BufferedReader Utilizar el método readLine() de BufferedReader para leer líneas import java.io.*; public class LecturaLineas { public static void main (String args[]) { try { File f = new File (args[0]); FileReader fr = new FileReader(f); BufferedReader br = new BufferedReader(fr); String linea = null; while ((linea=br.readLine())!=null) { System.out.println(linea); } fr.close(); } catch (Exception e) { } } } febrero 2010 Entrada/Salida 10 5 Entrada/Salida En Java: byte = 8 bits (256 valores) char = carácter Unicode de 16 bits (65535 valores) import java.io.*; Caracteres Bytes Lectura Reader InputStream Escritura Writer OutputStream febrero 2010 Entrada/Salida 11 Properties febrero 2010 Entrada/Salida 12 6 ¿Qué son? Los objetos Properties guardan parejas de Clave -> Valor “ancho” “alto” “colores” “otra clave” febrero 2010 “4” “7” “5” “otro valor” Entrada/Salida 13 Añadir parejas Properties properties = new Properties(); properties.put (“ancho”,”4”); properties.put (“alto”,”7”); properties.put (“colores”,”5”); properties.put (“otra clave”,”otro valor”); febrero 2010 Entrada/Salida 14 7 Extraer valores String v = properties.getProperty(“ancho”); String w = properties.getProperty(“alto”); String x = properties.getProperty(“colores”); febrero 2010 Entrada/Salida 15 Almacenar Properties en un fichero Con JDK 1.5 void guarda (Properties p, File f) throws IOException { OutputStream stream = new FileOutputStream(f); p.store(stream, “mis parejas”); Con JDK 1.6 void guarda (Properties p, File f) throws IOException { Writer writer = new FileWriter(f); p.store(writer, “mis parejas”) febrero 2010 Entrada/Salida 16 8 Cargar Properties de un fichero Con JDK 1.5 void carga (Properties p, File f) throws IOException { InputStream stream = new FileInputStream(f); p.load(stream); Con JDK 1.6 void carga(Properties p, File f) throws IOException { Reader reader = new FileReader(f); p.load(reader); febrero 2010 Entrada/Salida 17 Ejercicio public class Problema extends Partida el constructor necesita llamar a super(Tablero) necesita crear un tablero antes de llamar a super private static Tablero creaTablero (String) febrero 2010 Entrada/Salida 18 9 Ejercicio El método auxiliar… 1. leer el fichero que llega como parámetro Reader reader = new FileReader (fichero); Properties properties = new Properties(); properties.load(reader); 2. analizar blancas cargar(Bando.BLANCAS, properties.getproperty(“blancas”)); 3. analizar negras febrero 2010 Entrada/Salida 19 Ejercicio ¿Qué hay que hacer en “cargar(…)”? 1. Partir la cadena en trozos String[] trozo = cadena.split(“,”); 2. Extraer ficha y posición de cada trozo String que = trozo[i].trim().substring(0, 1); String donde = trozo[i].trim().substring(1); 3. Crear una pieza y colocarla en el tablero if (que.equals(“R”)) pieza = new Rey(bando); posicion = new Posicion(donde); tablero.setPieza(posicion, pieza); febrero 2010 Entrada/Salida 20 10