Beruflich Dokumente
Kultur Dokumente
Ficheros y Excepciones
Programacin
Curso 2014/15
Departamento de Sistemas Informticos y Computacin
Resultados de aprendizaje
Contenido
1.
Introduccin
Excepciones
Flujos y ficheros
2.
Ficheros de texto
3.
Ficheros binarios
1. Introduccin: Excepciones
o
1. Introduccin: Excepciones
Las excepciones pueden ser capturadas. De este modo se tiene conocimiento del error
ocurrido y se puede reaccionar.
try {
// Cdigo susceptible de generar excepciones
} catch (Tipo_Excepcion_A_Capturar
excep) {
1. Introduccin: Excepciones
Las excepciones pueden ser capturadas. De este modo se tiene conocimiento del error
ocurrido y se puede reaccionar.
try {
// Cdigo susceptible de generar excepciones
} catch { Tipo_Excepcion_A_Capturar
excep ) {
1. Introduccin: Excepciones
Ejemplo de escritura fuera del rango de un vector.
public class EjemploExcepcion {
public static void main (String [] args) {
try {
int [] vec = new int[2] ;
vec [0] = 1 ;
vec [1] = 1 ;
// escribimos fuera del vector
vec [2] = 1 ;
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println ("Error: " + e) ;
}
}
}
1. Introduccin: Excepciones
Ejemplo de divisin entre cero.
public class Exc2 {
public static void main (String args[]) {
int d, a;
try { // controla un bloque de cdigo.
d = 0 ;
a = 42 / d ;
System.out.println ("Esto no se imprimir.") ;
}
catch (ArithmeticException e) { // captura el error de divisin
System.out.println ("Divisin entre cero.") ;
}
System.out.println ("Despus de la sentencia catch.") ;
}
}
1. Introduccin: Excepciones
Programa que recibe como parmetro (en la lista de parmetros de main) un nombre y muestra
por pantalla el texto Hola nombre-de-la-persona" o el texto Hola, quien seas..."
en caso de que se produzca una excepcin por el hecho de no haber pasado ningn parmetro
a main.
import java.util.Scanner ;
public class P01_Ejemplo_Excepcion {
public static void main (String [ ] args) {
try {
System.out.print ("Hola " + args[0]) ;
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println ("Hola , quien seas...") ;
}
}
}
10
1. Introduccin: Excepciones
Al ordenar los bloques catch, las subclases de excepcin deben ir antes que la superclase
(en caso contrario no se ejecutarn nunca y dar error de compilacin por cdigo no alcanzable,
ya que la 2 excepcin est capturada por la 1).
public class SuperSubCatch {
public static void main(String args[]) {
try {
int a = 0;
int b = 42 / a;
}
catch (Exception e) {
System.out.println("catch para cualquier tipo de excepcin.");
}
/* Este catch nunca se ejecutar */
catch (ArithmeticException e) { // ERROR - no alcanzable
System.out.println("Esto nunca se ejecutar.");
}
}
}
11
1. Introduccin: Excepciones
Controlar que el valor ledo es un entero.
import java.io.* ;
import java.util.* ;
public class controlErrores {
public static void main (String[] args) {
int valor = leer() ;
System.out.println ("El nmero entero ledo es " + valor) ;
}
12
1. Introduccin: Excepciones
Controlar que el valor ledo es un entero.
public static int leer() {
Scanner teclado = new Scanner (System.in) ;
boolean salir = false ;
int leido = 0 ;
do {
try {
System.out.print ("Introduce un entero positivo: ") ;
leido = teclado.nextInt() ;
if (leido < 0)
System.out.println("Error. No es positivo") ;
else
salir = true ;
} catch (InputMismatchException ex) {
System.out.println ("Error. No es un entero") ;
}
String basura = teclado.nextLine() ;
} while (!salir) ;
return leido ;
}
}
13
1. Introduccin: ficheros
En Java la entrada/salida se realiza utilizando flujos (streams), que son secuencias de
informacin que tienen una fuente (flujos de entrada) o un destino (flujos de salida).
Fuente
flujo de
entrada
Programa
flujo de
salida
Destino
14
1. Introduccin: ficheros
o Un fichero es un conjunto de bits guardado en un dispositivo de almacenamiento
secundario (disco duro, USB stick, etc.).
o Permite almacenar los datos existentes en memoria de un programa para ser utilizados
posteriormente (por ese u otro programa).
o Caractersticas principales:
o
o Caractersticas adicionales:
o
15
Tipos de ficheros
En general, distinguimos entre dos tipos de ficheros:
Ficheros de Texto
Ficheros Binarios
Escritura/lectura eficiente.
Secuencia de caracteres.
16
La clase File
o La clase java.io.File permite abstraer el concepto de fichero y directorio.
o Ofrece mtodos para interaccionar con el sistema de archivos mediante los que se pueden
obtener las principales propiedades de un fichero o directorio: nombre, ruta, si es modificable
o no, ...
o La creacin de un objeto File no implica la construccin de un fichero en el sistema de
archivos.
o Los principales mtodos y constructores disponibles en la clase File son:
public File (String pathname)
17
La clase File
import java.io.* ;
public class ManejoFile {
public static void main (String [] args) {
File f = new File ("/programas/file2.txt") ;
if (f.exists())
System.out.println("El fichero existe") ;
else
System.err.println ("El fichero NO existe") ;
System.out.println ("getName((): " + f.getName()) ;
System.out.println ("getParen(): " + f.getParent()) ;
System.out.println ("length(): " + f.length()) ;
}
}
18
Descripcin
Crea un nuevo PrintWriter a partir de un objeto de tipo File. Lanza la
excepcin FileNotFoundException si no se puede escribir en el
Descripcin
fichero
PrintWriter
(OutputStream
out) Crea
PrintWriter(File
file)
Creaununnuevo
nuevoPrintWriter
PrintWriter a partir
de un
a partir
de File
un flujo de salida
void
print (float f) out)
PrintWriter(OutputStream
Crea un
PrintWriter
a partir
de un stream
Escribe
unnuevo
float
(y no termina
la lnea)
void
f)
voidprintln
print(float(float
f)
Escribeununfloat
float (y(ynoaade
termina
la lnea)
Escribe
un salto
de lnea)
void
(boolean
b)
voidprint
println(float
f)
Escribeununboolean
float (y aade
salto de
Escribe
(y noun
termina
la lnea)
void print(boolean b)
print (arg)
void
boolean checkError()
void println (arg)
boolean checkError ()
19
La clase PrintWriter
Ejemplos alternativos de creacin de un PrintWriter:
PrintWriter pw = new PrintWriter (new File(/tmp/f.txt));
Si el fichero no existe se crea uno nuevo, si existe se trunca su tamao a cero.
PrintWriter pw2 =
new PrintWriter (new FileOutputStream(/tmp/f.txt, true));
Si el fichero no existe se crea uno nuevo, si existe se mantiene, ya que se escribir
aadiendo (append) al final del mismo.
20
La clase PrintWriter
Ejemplo de programa que usa PrintWriter:
import java.io.* ;
public class TestPrintWriter {
public static void main (String [] args) {
String fichero = "file2.txt" ;
try {
PrintWriter pw = new PrintWriter (new File (fichero));
pw.print ("El veloz murcilago hind") ;
pw.println (" coma feliz cardillo y kiwi") ;
pw.println (4.815162342) ;
pw.close () ;
} catch (FileNotFoundException e) {
System.err.println("Problemas al abrir el fichero "+fichero) ;
}
}
}
21
La clase PrintWriter
Escribe un programa Java que cree un fichero de texto cuyo nombre se elegir en la
ejecucin y que tenga como contenido la frase Esto es una prueba.
22
La clase PrintWriter
Escribe un programa Java que cree un fichero de texto cuyo nombre se elegir en la
ejecucin y que tenga como contenido la frase Esto es una prueba.
import java.io.* ;
public class EjemploPrintWriter {
public static void main (String [] args) {
String fichero;
Scanner tec = new Scanner (System.in) ;
System.out.print ("Dame el nombre del fichero: ") ;
fichero = tec.nextLine() ;
try {
PrintWriter fi = new PrintWriter (new File (fichero));
fi.println ("Esto es una prueba") ;
fi.close () ;
} catch (FileNotFoundException e) {
System.err.println("Problemas al abrir el fichero "+fichero) ;
}
}
}
23
Descripcin
Scanner (File f)
Mtodo / Constructor
Scanner
(String
src)
Scanner(File
source)
Crea un
Scanner
leer datos
partir del String.
Crea
unnuevo
nuevo
Scannerpara
a partir
de una File
boolean
hasNextsrc)
()
Scanner(String
Devuelve
true Scanner
si hay al
menos
un token
en del
la entrada.
Crea
un nuevo
para
leer datos
a partir
String Lanza la excepcin
booleanhasNextInt
hasNext() ()
boolean
Devuelve
true sisihay
al menostoken
un token
la entrada
Devuelve true
el siguiente
de laen
entrada
se puede interpretar como un
entero.
Devuelve true si el siguiente token de la entrada es un entero
boolean hasNextInt()
int nextInt ()
int nextInt()
lanza
InputMismatchException
next ()
String
Devuelve
String next()
StringnextLine
nextLine() ()
String
void close()
void close ()
Cierra el Scanner
Cierra el Scanner
24
25
26
}
}
int n1 = scan.nextInt() ;
int n2 = scan.nextInt() ;
int n3 = scan.nextInt() ;
scan.nextLine() ;
String linea = scan.nextLine() ;
System.out.println ("Los tres nmeros son: " + n1 + ", " + n2 + ", " + n3) ;
System.out.println ("La lnea es: " + linea) ;
12
scanner.close () ;
34
Multiplcate por
cero!
cosas.txt
27
28
import java.io.* ;
import java.util.* ;
public class Test {
public static void main (String[] args) {
try {
Scanner scan = new Scanner (new File ("carreras.txt")) ;
while (scan.hasNextLine()) {
String linea = scan.nextLine() ;
String [] tokens = linea.split (" ") ;
System.out.println (tokens[0] + " : " + tokens[1]) ;
}
scan.close() ;
} catch (FileNotFoundException ex) {
System.out.println ("El fichero no existe. " + ex) ;
}
}
}
29
30
import java.io.* ;
import java.util.Scanner ;
public class ContadorPalabras {
public static void main(String[] args){
Scanner scanner = null ;
Scanner teclado = new Scanner (System.in) ;
int cont = 0 ;
}
}
31
32
import java.io.* ;
Problema
Ficheros de texto
import java.util.Scanner
;
public class ContadorPalabras {
public static void main(String[] args) {
Scanner scanner = null ;
Scanner teclado = new Scanner (System.in) ;
Construye
un programa
int cont
= 0 ; que cuente el nmero de lneas que aparecen en un archivo de
texto e imprima dicho nmero por pantalla.
try {
System.out.print ("Nombre del fichero: ") ;
String nombre = teclado.nextLine() ;
scanner = new Scanner (new File(nombre)) ;
} catch (FileNotFoundException ex) {
System.err.println("El fichero no existe."+ex.getMessage()) ;
System.exit(0) ;
}
while (scanner.hasNext()) {
String cad = scanner.nextLine() ;
cont++ ;
}
scanner.close() ;
System.out.println ("El nmero de lneas es " + cont) ;
}
}
33
3. Ficheros binarios
o Con ellos es posible almacenar y recuperar, de forma codificada, datos en ficheros (as,
un int ocupar 4 bytes, un double 8, etc.).
o En general se debe seguir una poltica en el almacenamiento que facilite despus la
recuperacin adecuada de la informacin.
o Por ejemplo: si se salva el contenido de una agenda, almacenando los valores
elementales de cada uno de sus componentes, se puede seguir una poltica de
agrupacin de la informacin en los denominados registros (grupos de informacin
similar que se repiten):
Nombre
Direccin
Telfono
Nombre
Direccin
campo
registro
registro
fichero
Telfono
34
3. Ficheros binarios
o Para la lectura o escritura de un fichero binario se debe:
1) Crear un File con el origen / destino de datos.
2) Envolverlo en un FileInputStream / FileOutputStream para crear un
flujo de datos desde / hacia el fichero.
3) Envolver el objeto anterior en un ObjectInputStream /
ObjectOutputStream para poder leer / escribir tipos de datos primitivos u
objetos del flujo de datos.
35
Ficheros binarios
La clase ObjectOutputStream contiene mtodos para escribir tipos primitivos y
objetos a un stream.
Existen mtodos anlogos en ObjectInputStream para leerlos.
Mtodo
Mtodo
/ Constructor
/ Constructor
Descripcin
Descripcin
ObjectOutputStream
(FileOutputStream
out)
un objeto
nuevo objeto
partir
del stream
de salida
ObjectOutputStream(FileOutputStream
out)
Crea unCrea
nuevo
a partiradel
stream
de salida
voidwriteInt(int
writeInt
void
v) (int v)
el entero
v al stream
decomo
salida4como
EscribeEscribe
el entero
v al stream
de salida
bytes 4 bytes
void
writeLongv)(long v)
void writeLong(long
long
v al stream
decomo
salida8como
EscribeEscribe
el long el
v al
stream
de salida
bytes 8 bytes
void
writeUTF (String
str)
void writeUTF(String
str)
elstr
String
str portable
en formato
portable
EscribeEscribe
el String
en formato
(UTF8
mod.)(UTF8 mod.)
void
writeDouble (double
v)
void writeDouble(double
v)
el double
v aldestream
salida
como 8 bytes
EscribeEscribe
el double
v al stream
salida de
como
8 bytes
void
writeObject obj)
(Object obj)
void writeObject(Object
el obj
Object
objde
al salida.
streamLodeque
salida,
lo que
EscribeEscribe
el Object
al stream
provoca
la provoca
la de
escritura
todos de
loslosobjetos
que obj(yest
escritura
todos losdeobjetos
que obj de
estlos
compuesto
as
recursivamente).
compuesto (y as recursivamente).
36
37
38
39
40
41
42
43
44
45
46
Conclusiones
o El uso de ficheros permite que la informacin sobreviva a la ejecucin de los programas
mediante el uso de almacenamiento secundario.
47
Problema
o Escribe un programa que lea un fichero de texto de nombre entrada.txt que
contiene en cada lnea la parte real e imaginaria de un nmero complejo y genere
otro fichero de texto de nombre salida.txt en el que cada lnea sea el mdulo de
los nmeros complejos contenidos en el fichero de entrada.
48
import java.io.* ;
import java.util.Scanner ;
class FicherosTexto {
public static void main (String[] args) {
String fichero1 = "entrada.txt" ;
String fichero2 = "salida.txt" ;
int i1, i2;
try {
Scanner scan = new Scanner(new File(fichero1)) ;
// para lectura
// para escritura
while (scan.hasNext()) {
i1 = scan.nextInt() ;
i2 = scan.nextInt() ;
String basura = scan.nextLine() ;
double res = Math.sqrt (i1*i1+i2*i2) ;
pw.println (res) ;
}
pw.close() ;
scan.close() ;
}
} catch (FileNotFoundException e) {
System.err.println("Problemas al abrir el fichero " + fichero1) ;
}
}
}
49
Problema
o Tenemos un archivo con informacin de una consulta electoral. El primer valor
almacenado indica el nmero de mesas electorales. A partir de ah, para cada mesa se
dispone de su identificador (cadena de caracteres) y del nmero de votos que cada uno
de los cinco partidos presentados (A, B, C, D y E) ha obtenido en esa mesa y el nmero
completo de personas censadas en esa mesa con derecho a voto.
Construye un programa en Java que nos muestre por pantalla el nmero de votos totales
de los partidos y para cada mesa el nmero de personas que no ha votado.
(2.25 puntos)
import java.io.* ;
50
import java.util.Scanner ;
class FicherosTexto {
public static void main (String[] args) {
Scanner teclado = new Scanner (System.in) ;
System.out.print ("Nombre del fichero: ") ;
String nombre = teclado.nextLine() ;
try {
Scanner scan = new Scanner (new File(nombre)) ;
int num = scan.nextInt() ;
int [][] votacion = new int [num][6] ;
String [] mesas = new String [num] ;
for (int i=0; i<votacion.length; i++) {
String basura = scan.nextLine() ;
mesas[i] = scan.nextLine() ;
for (int j=0; j<votacion[0].length; j++)
votacion[i][j] = scan.nextInt() ;
}
scan.close() ;
int [] votos = new int [5] ;
calculo (votacion, votos) ;
mostrarResultados (votos) ;
mostrarAbstencion (mesas, votacion) ;
}
// para lectura
51
catch (FileNotFoundException e) {
System.err.println ("Problemas al abrir el fichero " + nombre) ;
}
}
public static void calculo (int [][]resul, int [] v) {
for (int j=0; j<v.length; j++) {
v[j] = 0 ;
for (int i=0; i<resul.length; i++)
v[j] += resul[i][j] ;
}
}
52
import java.io.* ;
53
import java.util.Scanner ;
class FicherosTexto {
public static void main (String[] args) {
Scanner teclado = new Scanner (System.in) ;
System.out.print ("Nombre del fichero: ") ;
String nombre = teclado.nextLine() ;
try {
ObjectInputStream entrada = new ObjectInputStream (new
FileInputStream (nombre)) ;
int num = entrada.readInt() ;
int [][] votacion = new int [num][6] ;
String [] mesas = new String [num] ;
for (int i=0; i<votacion.length; i++) {
mesas[i] = entrada.readUTF() ;
for (int j=0; j<votacion[0].length; j++)
votacion[i][j] = entrada.readInt() ;
}
entrada.close() ;
int [] votos = new int [5] ;
calculo (votacion, votos) ;
mostrarResultados (votos) ;
mostrarAbstencion (mesas, votacion) ;
}
54
catch (FileNotFoundException e) {
System.err.println ("Problemas al abrir el fichero " + nombre) ;
}
catch (IOException e) {
System.err.println ("Problemas al utilizar el fichero " + nombre) ;
}
}
public static void calculo (int [][]resul, int [] v) {
for (int j=0; j<v.length; j++) {
v[j] = 0 ;
for (int i=0; i<resul.length; i++)
v[j] += resul[i][j] ;
}
}
55
56
import java.io.* ;
Pasar de fichero texto a binario
import java.util.Scanner ;
class FicherosTexto {
public static void main (String[] args) {
Scanner teclado = new Scanner (System.in) ;
System.out.print ("Nombre del fichero: ") ;
String nombre = teclado.nextLine() ;
String nombre2 = "salida.data" ;
try {
Scanner scan = new Scanner (new File(nombre)) ;
ObjectOutputStream datosFichero = new ObjectOutputStream (new FileOutputStream (nombre2));
int num = scan.nextInt() ;
datosFichero.writeInt(num) ;
int [][] votacion = new int [num][6] ;
String [] mesas = new String [num] ;
for (int i=0; i<votacion.length; i++) {
String basura = scan.nextLine();
mesas[i] = scan.nextLine() ;
datosFichero.writeUTF(mesas[i]) ;
for (int j=0; j<votacion[0].length; j++) {
votacion[i][j] = scan.nextInt() ;
datosFichero.writeInt(votacion[i][j]) ;
}
}
scan.close() ;
datosFichero.close() ;
int [] votos = new int [5] ;
calculo (votacion, votos) ;
mostrarResultados (votos) ;
mostrarAbstencion (mesas, votacion) ;
}
catch (FileNotFoundException e) {
System.err.println("Problemas al abrir el fichero " + nombre) ;
}
catch (IOException e) {
System.err.println ("Problemas al escribir en el fichero " + nombre) ;
}
}
57
Problema
o Dado un fichero binario en el que estn contenidos todos los alumnos del primer
curso de la asignatura Programacin de la ETSIT con la siguiente informacin:
Nombre y nota,
construye un programa en Java que escriba en un fichero de texto los alumnos
aprobados (con nota mayor o igual a 5).
(1.5 puntos)
58
import java.io.* ;
import java.util.* ;
class FicheroNotas {
public static void main (String[] args) {
Scanner teclado = new Scanner (System.in) ;
System.out.print ("Nombre del fichero inicial: ") ;
String nombre1 = teclado.nextLine() ;
System.out.print ("Nombre del fichero final: ") ;
String nombre2 = teclado.nextLine() ;
try {
ObjectInputStream datosFichero = new ObjectInputStream (new FileInputStream (nombre1));
PrintWriter grabar = new PrintWriter (new File(nombre2)) ;
while (true) {
String nombre = datosFichero.readUTF() ;
int nota = datosFichero.readInt() ;
if (nota>=5) {
grabar.println (nombre) ;
grabar.println (nota) ;
}
}
// grabar.close() ;
Nunca se alcanza esta instruccin por culpa del while (true)
// datosFichero.close() ;
}
catch (FileNotFoundException e) {
System.err.println ("Problemas al abrir el fichero " + nombre1) ;
}
catch (IOException e) {
System.err.println ("Problemas al escribir en el fichero " + nombre2) ;
}
}
}