Capítulo VI - Strings, I/O,Formatting,and Parsing

84
Capítulo VI - Strings, I/O,Formatting,and Parsing Usar String, StringBuffer y StringBuilder Archivos I/O usando el paquete java.io Serializacion usando el paquete java.io Trabajando con Dates, Number y Currencies Uso de expresiones regulares

description

Capítulo VI - Strings, I/O,Formatting,and Parsing. Usar String, StringBuffer y StringBuilder Archivos I/O usando el paquete java.io Serializacion usando el paquete java.io Trabajando con Dates, Number y Currencies Uso de expresiones regulares. String, StringBuffer y StringBuilder. - PowerPoint PPT Presentation

Transcript of Capítulo VI - Strings, I/O,Formatting,and Parsing

Page 1: Capítulo VI - Strings, I/O,Formatting,and Parsing

Capítulo VI - Strings, I/O,Formatting,and Parsing

• Usar String, StringBuffer y StringBuilder• Archivos I/O usando el paquete java.io• Serializacion usando el paquete java.io• Trabajando con Dates, Number y Currencies• Uso de expresiones regulares

Page 2: Capítulo VI - Strings, I/O,Formatting,and Parsing

String, StringBuffer y StringBuilder

• En Java 5 se aumento la clase StringBuilder, que tiene la misma funcionalidada que StringBuffer, la diferencia es que StringBuilder no es sincronizada, mientras que StringBuffer si lo es.

• Por lo tanto StringBuilder es mucho mas rapido.

Page 3: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase String

• Strings con objetos inmutableso En java cada carácter es un Stringo Son caracteres Unicode de 16 bits.

• Eje:o String s = new String();o s = “abc”;o S = new String(“abc”);

• Inmutabilidad: Una ves que fue asignado un valor, este no puede cambiar.

• Los String son imnutables, pero sus referencias no.

Page 4: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Procesos..o String s = “abcdef”;o s.concat(“ ghij”);o Como resultado tenemos s = “abcdef ghij”, que es lo que

paso aquí????o Se crearon 3 objetos String, el primero “abcdef”, el segundo,

“ ghij” y el tercero, “abcdef ghjij“.o En donde solo “abcdef ghjij” esta referenciada, y vamos a

decir que esta “perdida”, puesto que no se las puede acceder desde nuestro contexto.

Page 5: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Otro ejemplo String x = "Java"; x.concat(" Rules!"); System.out.println("x = " + x);

Page 6: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Y asi pasará si aplicamos los distintos metodos de la clase Stringo x.toUpperCase();o x.replace('a', 'X');

• Pero si se haceo x = x.concat(“ Rules!”);

Page 7: Capítulo VI - Strings, I/O,Formatting,and Parsing

Factores importantes sobre String y Memoria

• Para un buen manejo de la maquina virtual, se creo la “String constant pool” en java, que es donde son puestos los objetos String.

• Cuando el compilador ver un String, verifica en el pool y si existe referencia la variable a ese String ya existente.

• Es asi que varias variables de referencia pueden estar apuntando al mismo String.

• Es por esto tambien que la clase String está marcada como final, para que no se pueda cambiar el comportamiento de la clase.

Page 8: Capítulo VI - Strings, I/O,Formatting,and Parsing

Creando un nuevo String

• En s = “abc”;o En este caso abc va al pool de String, referiado por s.

• En s = new String(“abc”);o En este caso el objeto se crea en memoria normal como

otro objeto mas y en el pool de String.

Page 9: Capítulo VI - Strings, I/O,Formatting,and Parsing

Métodos Importante de la clase String

• Metodos usados comunmente y que se veran en el examen.

• charAt(): Retorna el caracter localizado en el indice dado.• concat(): Agrega un String al final de otro.• equalsIgnoreCase(): Determina si dos String son iguales, ignorando

case• length(): Devuelve el numero de caracteres.• replace(): Reemplaza las ocurrencias con un caracter dado.• substring(): Retorna una parte del String.• toLowerCase(): Convierte a minuscula.• toString(): Retorna el valor String.• toUpperCase(): Convierte a mayuscula.• trim(): Remueve los espacios en blanco al final del String.

Page 10: Capítulo VI - Strings, I/O,Formatting,and Parsing

• public char charAt(int index) El indice empieza en cero. String x = "airplane"; System.out.println( x.charAt(2) );

• public String concat(String s) String x = "taxi"; System.out.println( x.concat(" cab") ); o Los operadores + y += tienen la misma funcionalidad que concat. String x = "library"; System.out.println( x + " card"); String x = "Atlantic"; x += " ocean" System.out.println( x );

Salida: r

Salida: taxicab

Salida: library card

Salida: Atlantic ocean

Page 11: Capítulo VI - Strings, I/O,Formatting,and Parsing

• public boolean equalsIgnoreCase(String s)o Retorna verdad si es que los String son iguales, sin importar el case. String x = "Exit"; System.out.println( x.equalsIgnoreCase("EXIT")); // "true" System.out.println( x.equalsIgnoreCase("tixe")); // "false“

• public int length()o Retorna la longitud del String String x = "01234567"; System.out.println( x.length() );

• public String replace(char old, char new)o El nuevo aracter es reemplazado por el nuevo String x = "oxoxoxox"; System.out.println( x.replace('x', 'X') );

Retorna: "8"

Salida: oXoXoXoX

Page 12: Capítulo VI - Strings, I/O,Formatting,and Parsing

• public String substring(int begin)o El indice empieza desde cero, y devuelve desde el indice

indicado hasta el final del string.• public String substring(int begin, int end)

o El indice begin tambien empieza en cero, pero el segundo argumento, empieza en 1 e indica hasta donde tomar el String, los dos desde el primer caracter del string.

Eje: String x = "0123456789"; System.out.println( x.substring(5) ); Salida: 56789

System.out.println( x.substring(5, 8)); Salida: 567

Page 13: Capítulo VI - Strings, I/O,Formatting,and Parsing

• public String toLowerCase()o Convierte a minuscula String x = "A New Moon"; System.out.println( x.toLowerCase() );

• public String toString()o Retorna el String del string, por que esta??, porque todos

objetos tienen este metodo. String x = "big surprise"; System.out.println( x.toString() );

• public String toUpperCase()o Retorna el string en mayusculas String x = "A New Moon"; System.out.println( x.toUpperCase() );

Salida: A NEW MOON

Salida: a new moon

Page 14: Capítulo VI - Strings, I/O,Formatting,and Parsing

• public String trim()o Retorna el string sin los espacios de adelante y ni los de

atrás. String x = " hi "; System.out.println( x + "x" ); Salida: " hi x " System.out.println( x.trim() + "x"); Salida: " hix "

Page 15: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clases StringBuffer y StringBuilder

• Estas clases se hacen importante cuando se quiere hacer manejo de grandes cantidades de strings.

• Dado que sabemos que los String son inmutables, si es que manejamos grandes cantidades de strings asi no mas, acaberemos por llenar el pool de strings.

• Se recomienda el uso de estos objetos cuando se va a trabajar con archivos I/O, asi no se usa el pool y se trabaja con estos string en mismo segmento de memoria.

Page 16: Capítulo VI - Strings, I/O,Formatting,and Parsing

StringBuffer vs. StringBuilder

• StringBuilder salio en Java 5, y tiene exactamente el mismo API que StringBuffer, la diferencia radica en que StringBuilder no es thread safe, o sea que sus metodos no tienen synchronize.

• Sun recomienda usar cuando sea posible StringBuilder porque es mucho mas rapido.

• En el examen puede que se ecuentre preguntas con entre estos dos objetos, pero sera cuando se trate sobre theads safe.

Page 17: Capítulo VI - Strings, I/O,Formatting,and Parsing

Usando StringBuilder y StringBuffer

• Ya se habia discutido sobre los metodos de String, sobre la existencia del pool y los string dejados ahí.

• Ahora los string son tratados como objetos, y como tal, los cambio hechos a su contenido, es aplicado sin necesidad de estar haciendo asignaciones extras.

• Eje: StringBuffer sb = new StringBuffer("abc"); sb.append("def"); System.out.println("sb = " + sb);

• Y asi todos los metodos en si, puedes ser aplicados en cadena.• Eje:

StringBuilder sb = new StringBuilder("abc"); sb.append("def").reverse().insert(3, "---"); System.out.println( sb );

Salida: abcdef

Salida: fed---cba

Page 18: Capítulo VI - Strings, I/O,Formatting,and Parsing

Metodos importantes

• public synchronized StringBuffer append(String s)o Agrega el parametro que se pasa al final del String. Acepta

boolean, char, double, float, int, long y otros.o Eje:

StringBuffer sb2 = new StringBuffer("pi = "); sb2.append(3.14159f);

• public StringBuilder delete(int start, int end)o Elimina el texto desde el indice start(desde cero), hasta el

indice end (desde uno).o Eje:

StringBuilder sb = new StringBuilder("0123456789"); System.out.println(sb.delete(4,6));

Salida: pi = 3.14159

Salida: 01236789

Page 19: Capítulo VI - Strings, I/O,Formatting,and Parsing

• public StringBuilder insert(int offset, String s)o Inserta en el objeto el String s en la posicion offset pasada,

la cual empieza en cero.o Eje:

StringBuilder sb = new StringBuilder("01234567"); sb.insert(4, "---"); System.out.println( sb );

• public synchronized StringBuffer reverse()o Reversa el orden de los caracteres, poniendo el primero al

ultimo y el ultimo en el primero.o Eje:

StringBuffer s = new StringBuffer("A man a plan a canal Panama");

sb.reverse(); System.out.println(sb);

Salida: 0123---4567

Salida: amanaP lanac a nalp a nam A

Page 20: Capítulo VI - Strings, I/O,Formatting,and Parsing

• public String toString()o Retorna el valor del objeto como String

StringBuffer sb = new StringBuffer("test string"); System.out.println( sb.toString() );

Salida: test string

Page 21: Capítulo VI - Strings, I/O,Formatting,and Parsing

Ojo para el Examen

• En el examen se verán mas ejemplos de uso de “metodos encadenados”. Pero no se verán mas de 3.o Resultado = metodo1().metodo2(). metodo3();

• Tips para saber llevar estos casos.o Determinar el método de mas a la izquierda.o SI hay un segundo método, el resultado del primero, invoca

al segundo y este será el resultado.o Si existe un tercero, el resultado del segundo llama al

tercero, y el resultado de este será el resultado final.o Eje:

String x = "abc"; String y = x.concat("def").toUpperCase().replace('C','x'); System.out.println("y = " + y);

Salida: y = ABxDEF

Page 22: Capítulo VI - Strings, I/O,Formatting,and Parsing

Navegacion Archivos y I/O

• El examen esta limitado a I/O de archivos para caracteres y serializacion.

• Cosas que se necesitan saber.• File: El API dice que es una clase abstracta para la

representación de archivos, con la cual se trabaja a un nivel alto, haciendo nuevos archivos, buscando y borrandolos, creando directorios, y trabajando con rutas.

• FileReader: Clase usada para lectura de caracteres en archivos. El método read(), permite leer carácter por carácter, o un numero de caracteres. Generalmente esta wrapped, en clases como BufferedReader, que tienen métodos mejorados y mejoran el tratos de datos.

Page 23: Capítulo VI - Strings, I/O,Formatting,and Parsing

• BufferedReader: Hace mas eficiente el FileReader, lee grandes pedazos de datos como archivos y los mantiene en un buffer, lo que reduce el numero de veces de acceso al archivo en bajo nivel. Tiene el método readLine(), que lee toda una línea de un archivo.

• FileWriter: Clase para escribir caracteres a un archivo. Su método write() escribe caracteres o String en el archivo, es de bajo nivel. Wrapped en clases de alto nivel como BufferedWriter, PrintWritter que dan un mejor rendimiento y métodos mas flexibles para el manejo de datos.

• BufferedWriter: Hace mas eficiente al FileWriter, escribe grandes pedazos de datos minimizando el numero de acceso al archivo en nivel bajo. Tiene el método newLine(), crea un separador de línea para la plataforma usada.

Page 24: Capítulo VI - Strings, I/O,Formatting,and Parsing

• PrintWriter: Ha sido mejorada en Java 5, permite manejar de manera mas flexible los datos, con metodos como format(), printf() y append().

Page 25: Capítulo VI - Strings, I/O,Formatting,and Parsing

Ojo En el examen

• Las clases Stream son usadas para escribir bytes, y los Readers y Writers son usados para escribir caracteres, Si se ve una clase del API que contiene la palabra Stream como DataOutputStream, entonces la pregunta debe de tratarse sobre serializacion o algo no relacionado al objetivo actual.

Page 26: Capítulo VI - Strings, I/O,Formatting,and Parsing

Creando Archivos usando la clase File

• Es indispensable saber que cuando se habla de la clase File se esta hablando de la representación de archivos o directorios que existen en el disco.

class Writer1 {public static void main(String [] args) {File file = new File("fileWrite1.txt"); }}

Aquí todavía no hay archivo

• Si se hace lo anterior NO se crea el archivo. Solo se está creando un nombre de archivo.

Page 27: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Que se puede hacer con la clase Fileclass Archivos2 {public static void main(String [] args) {try { // warning: exceptions possibleboolean newFile = false;File file = new File // it's only an object ("fileWrite1.txt");System.out.println(file.exists()); newFile = file.createNewFile(); System.out.println(newFile); System.out.println(file.exists()); } catch(IOException e) { }}}

// Existe archivo??// Talvez lo crea// Verificar si lo creo// Existe archivo??

Primera Salida:falsetruetrue

Segunda Salida:truefalsetrue

Page 28: Capítulo VI - Strings, I/O,Formatting,and Parsing

Usando FileWriter y FileReader

• Estas clases probablemente no se los vaya usar, porque generalmente se usa un wrapper.

• Ver ejemplo Writer2.java

• FileWriter fw = new FileWriter(file) hace 3 cosas:o Crea referencia fwo Crea nuevo objeto FileWritero Crea un archivo vacio.

• El metodo read del objeto FileReader pone en el arreglo de int los caracteres en el archivo.

Page 29: Capítulo VI - Strings, I/O,Formatting,and Parsing

• flush y close, cuando se trabaja con stream, ocurrirá algo de buffering, y no se sabe cuando exactamente se será enviado, asi que se puede usar flush para enviar los datos en ese momento.

• Y el close, se lo debe usar ya que cuando se hace lectura o escritura, se usan recursos del sistema que son caro y limitados , y este método los libera.

Page 30: Capítulo VI - Strings, I/O,Formatting,and Parsing

Pequeño API de I/O

Page 31: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Consejo para el uso de clases de manejo de archivos:o 1. Ver una clase que maneje File en su constructor.o 2. Encontrar un método que se apegue mas a lo que

buscamos.o 3. Ver que pide el constructor y pasarle en objeto, en base a

lo que pide, como por ejemple el PrintWriter tiene algunos constructores, usar el mas fácil.

• OJO: En el examen se verifica el conocimiento de las clases encadenandolas, asi que se recomienda estudiar el pequeño API para saber que es legal.

Page 32: Capítulo VI - Strings, I/O,Formatting,and Parsing

Trabajando con archivos y directorios

• Para empezar, la clase File puede servir para borrar, renombrar, determinar si existe un archivo o directorio, diferencia entre ambos, etc.

• Creacion de un archivo, dos maneras:o 1. Metodo createNewFile()

File file = new File("foo"); //archivo no creado file.createNewFile();

o 2. Crear un Reader, Writer o Stream. Específicamente un FileReader, FileWriter, a PrintWriter, a FileInputStream, o FileOutputStream.

Page 33: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Creacion de un directorio. Se puede hacer uso del metodo mkDir() File myDir = new File("mydir"); // crea el objeto myDir.mkdir(); //crea el directorio

• Una vez creado el diretorio, se puede trabajar con este File myFile = new File(myDir, "myFile.txt"); myFile.createNewFile();

• CUIDADO: Hemos visto la creacion de directorios y archivos, pero cuidado.

Page 34: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Si tenemos: File myDir = new File("mydir"); // myDir.mkdir(); // No se crea el directorio File myFile = new File( myDir, "myFile.txt"); myFile.createNewFile();o Tendremos un problema, puesto que aquí no crea el directorio, arrojara

un excepcion: java.io.IOException: No such file or directory

• Ver Ejemplo Archivo3.java

Page 35: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Eliminación de archivos y directorios

• Ver ejemplo Archivos4.java

• Consideraciones:o Borrar: No se puede borrar un directorio si no esta vacio.o Renombrar: Se le tiene que pasar al objeto File existente un

nombre valido.o Renombrar: Si se puede renombrar a un directorio aun si no

esta vacio.

Page 36: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Búsqueda:o Ver ejemplo Archivo5.java

• El argumento que se pasa es el nombre del archivo, y devuelve una lista del contenido del directorio.

Page 37: Capítulo VI - Strings, I/O,Formatting,and Parsing

Serialización

• La idea principal de la serialización en los archivos, con objetos, es poder grabar los objetos, con los estados de sus atributos.

• Y una vez guardados, poder recuperarlos tal como se lo guardo, todo esto sin tener que hacer nada mas que utilizar los métodos que ya tienen las clases.

Page 38: Capítulo VI - Strings, I/O,Formatting,and Parsing

Trabajando con ObjectOutputStream y ObjectInputStream

• Dos métodos básicos, uno para serializar y escribir al archivo y otro para leer y deserializar.o ObjectOutputStream.writeObject() //Serializar y escribiro ObjectInputStream.readObject() //leer y deserializar

• Estas clases son wrapper (de alto nivel), y que talvez se tenga que usar una de bajo nivel como FileOutputStream y FileInputStream.

• Ver ejemplo SerializeCat.java

Page 39: Capítulo VI - Strings, I/O,Formatting,and Parsing

Objetos Graphs

• En resumen el “Object Graphs” es el conjunto de atributos que tiene un objeto. Y la clase ObjectOutputStream se encarga de serializar todos los atributos aunque sean otros objetos.

• Algo importante es que todos los objetos que se vayan a pasar, tiene que se ser serializables.

• Ver ejemplo SerializeDog.java

Page 40: Capítulo VI - Strings, I/O,Formatting,and Parsing

Consideraciones

• Que pasa si es que un objeto que es usado como atributo, no se puede ser serializado, ya se porque:o Es una clase final y no se la puede modificaro Si no es final, y tiene atributos que no pueden ser

serializados.o O porque simplemente no se puede usar una subclase en el

modelo.• Pero aun se quiere serializar… Entonces, la solución

que se propone es marcar al atributo como transient, lo que pasará será que no se pone ala tributo dentro de la serialización.

• Ver ejemplo SerializeDog2.java• Pero que pasa con el atributo ????

Page 41: Capítulo VI - Strings, I/O,Formatting,and Parsing

Usando writeObject() y readObject()

• La alternativa que se da en implementar los métodos writeObject para OutputStream y readObject para InputStream.

• Dentro de estos metodos se pone el codigo con el cual se pueden guardar atributos extras a los atributos de la clase principal, pero que son los valores que corresponden a los objetos que no pudieron ser serializados.

• Al momento de serializar o deserializar el objetos, estos métodos son invocados.

• Ver ejemplo SerializeDog3.java

Page 42: Capítulo VI - Strings, I/O,Formatting,and Parsing

Analisis…

• Los métodos sobrescritos pueden lanzar excepciones, pero se recomienda manejarlos

• EL método defaultWriteObject() y defaultReadObject() que se invoca al principio, indica a la JVM que se haga la serializacion normal y luego se haga algo extra.

• Se pueden escribir cosas extras, antes o después del método default, pero al momento de leerlo, se lo tiene que hacer en el mismo orden.

• EL método defaultReadObject() maneja la deserialización si no se implementa el método readObject().

• Finalmente se leyó el atributo extra guardado, justo después del defaultReadObject(), para seguir el orden de guardado.

Page 43: Capítulo VI - Strings, I/O,Formatting,and Parsing

Como la herencia afecta la serialización

• Cuando se hace una deserializacion, la clase que se recupera, no pasa por el constructor.

• Los atributos declarados como transient, se inicializan con su valor por defecto, dentro del contexto de inicialización de variable de una clase.

• Que pasa si es que la superclase no es serializable, la subclase lo será??

• Punto importante: Los atributos heredados de las clases que no son serializables, al deserializar se iniciaran con los valores que se les da en el constructor o valores por default, no con el valor que fueron guardados.

• OJO: para el examen se querrá saber que variables y cuales no se restauraran con los valores que fueron guardados.

Page 44: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Ver ejemplo SuperNotSerial.java y analizar

• Por ultimo: Cuando se serializa una Collection o un arreglo, todos los elementos tienen que ser serializables. Uno solo que no lo sea, y fallará toda la serializacion.

Page 45: Capítulo VI - Strings, I/O,Formatting,and Parsing

Serializacion no es para Staticsz

• Las variables estaticas NUNCA son guardadas, ya que lo que se guarda es el estado, y estas no pertenecen a la instancia de la clase.

Page 46: Capítulo VI - Strings, I/O,Formatting,and Parsing

NOTAS:

• DataInputStream y DataOutputStream no serán evaluadas.

• Cuando se vaya deserializar, la clase serializada y deserilizada tienen que estar en la misma versión. Si son diferentes versiones, puede haber problemas.

Page 47: Capítulo VI - Strings, I/O,Formatting,and Parsing

Dates, Numbers, y Currency

• Clases relacionadas con fechas que se necesitan saber:o java.util.Date: Casi todos los metodos estan deprecated, se

puede usar de puente entre Calendar y DateFormat. Representa una fecha mutable.

o java.util.Calendar: Cantidad de metodos para convertir y manipular fecha y horas.

o java.text.DateFormat: Da estilo a formato de la fecha, y tambien usa locale para uso internacional.

o java.text.NumberFormat: Usado para formatear numeros.o java.util.Locale: Trabaja en conjunto con las dos anteriores

y permite dar un formato mas rapido de acuerdo a donde se encuentren.

Page 48: Capítulo VI - Strings, I/O,Formatting,and Parsing

Orquestando clases relaciona con Números y Fechas

Page 49: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase Date

• Representa la fecha y la hora. • Internamente esta representado por un long primitivo

que tiene los milisegundos desde el 1 de Enero de 1970 hasta la fecha que se quiere tener.

• Ejemplo: import java.util.*; class TestDates { public static void main(String[] args) { Date d1 = new Date(1000000000000L); // a trillion! System.out.println("1st date " + d1.toString()); } }

Page 50: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase Date (cont…)

• La mayoria de los metodos has sido deprecated, pero todavia es aceptable usar getTime() y setTime().

• Aunque es trabajoso usar milisegundos.• Ejemplo: Se agrega una hora al anterior

class TestDates2 { public static void main(String[] args) { Date d1 = new Date(1000000000000L); // a trillion! System.out.println("1st date " + d1.toString()); d1.setTime(d1.getTime() + 3600000); // 3600000 millis / hour System.out.println("new time " + d1.toString()); } }

Page 51: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase Date (cont…)

• Y por ultimo, la forma mas sencilla de obtener la fecha y hora del sistema es:o Date date = new Date();

Page 52: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase Calendar

• Esta clase nos va a yudar un poco mas a trabajar con las fechas. Tiene mas metodos, una vez que se tenga una idea de unos cuantos, se podrá trabajar con el resto de igual manera.

• Es una clase abstracta, asi que para instanciarla se debe usar el metodo sobreescrito getInstane()o Calendar cal = Calendar.getInstane();

• Al hacer esto, se esta llamando a una subclase de Calendar, y no se puede estar seguro de cual se vaya a obtener, pero para la mas segura que salga es GregorianCalendar.

Page 53: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase Calendar (cont…)

• Ejemplo:o Ver ejemplo: Calendar1.java

• Punto a analizar:o Metodo: getFirstDayOfWeek()o c.SUNDAYo Metodo: c.add(Calendar.MONTH, 1)

Se puede sumar o restar, dias, meses y años.o Metodo: getTime()

Page 54: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase Calendar (cont…)

• Metodo: rollo Actua igual que add, solo que no cambia el sgte nivel de lo

que se aumenta o reduce.o Ejemplo:

// c es October 8, 2001 c.roll(Calendar.MONTH, 9); // notar el año Date d4 = c.getTime(); System.out.println("new date " + d4.toString() ); Salida: new date Fri Jul 08 19:46:40 MDT 2001

• Y así mismo si por ejemplo se aumenta horas, el dia no cambiará.

• NOTA: Para el exámen no se necesita saber todos los atributos de Calendar.

Page 55: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase DateFormat

• Clase para darle formato a la fecha.• Ejemplo:

o Ver ejemplo FormatoFecha.java• Analisis:

o Es una clase abstractao Tres metodos para crear:

getInstance(): Fecha mas hora. getDateInstance(): Solo fecha. Estilo MEDIUM por default. getTimeInstance(): Solo hora. Los dos ultimos con sobrecarga. Donde aceptan el estilo y/o

Locale• Finalmente se usa el metodo format(), para obtener el

String.

Page 56: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase DateFormat (cont…)

• Metodo: parseo Se le pasa la fecha en String, la cual es cambiada y

devuelve un objeto Date.o Arroja una ParseException, si es que el String pasado no

tiene el formato adecuado.o Ver ejemplo: ParseFecha.javao Dependiendo el estilo que se use, se perderá precisión.

Dice el API que este metodo es flexible, pero no hay que confiarse.

Page 57: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase Locale

• Se define a Locale como una region cultural, politica y geografica.

• Los constructores que se necesita entender para el examen son:o Locale(String language)o Locale(String language, String country)

• El lenguage es representado por los codigos de lenguage de ISO 639, donde hay mas de 500 codigos.

• El codigo de paises tambien viene del ISO, en donde hay cerca de 240 codigos.

• Afortunadamente no se tiene que saber los codigos.

Page 58: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase Locale (cont…)

• Ejemplo: Italiano e Italiano en Suiza.o Locale locPT = new Locale("it"); // Italiano Locale locBR = new Locale("it", "CH"); // Switzerlando Salida:

sabato 1 ottobre 2005 sabato, 1. ottobre 2005

• Ver ejemplo Locale1.java• OJO: La unica manera de poner un Locale a

DateFormat y NumberFormat es en la instanciacion.

Page 59: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase Locale (cont…)

• Un par de metodos mas:o getDisplayCountry(): o getDisplayLanguage():

Ver ejemplo: Locale2.java

Page 60: Capítulo VI - Strings, I/O,Formatting,and Parsing

Clase NumberFormat

• Se la trata parecido a DateFormat• Los metodos principales son:

o getInstance() : Formato por defaulto getCurrencyInstance(): Formato por default, incluyendo el

simbolo de la moneda.• Ver ejemplo NumeroFormato1.java

Page 61: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Otros metodos:o getMaximumFractionDigits()o setMaximumFractionDigits()o parse(String s): acepta un String para convertirlo a numeroo setParseIntegerOnly(boolean b): Acepta un boolean.

• Ver ejemplo NumeroFormato2.java• OJO:

o Al terner un numero maximo de decimales, el metodo format redondea, no trunca.

o El el numero maximo de decimales no funciona en parse(), este devuelve todos los decimales que se pasen.

o El metodo parse() deber estar en un try/catch, porque arroja un parseException.

Page 62: Capítulo VI - Strings, I/O,Formatting,and Parsing

Tabla de Resumen

Page 63: Capítulo VI - Strings, I/O,Formatting,and Parsing

Parsing, Tokenizing, and Formatting

• Se cubriran 3 ideas basicas:o Encontrat Cosas: Se usaran las clases java.regex.Pattern,

java.regex.Matcher, y java.util.Scanner classes. Para busqueda de texto, en cualquier lugar.

o Tokenizing cosas: Si se tiene por ejemplo “1500.00,343.77,123.4” y se lo quiere pasar numeros individuales, se los puede separar y la clase java.util.Scanner se encarga de hacer token los datos.

o Formatiando Cosas: Como pasar de 32500.00F a $32.500,00 a traves de java.util.Formatter y sus metodos printf() y format().

Page 64: Capítulo VI - Strings, I/O,Formatting,and Parsing

Tutorial de Busqueda

• Regex (Regular Expresion) es un leguaje que ayuda a los programadores a hacer busquedas, los Lenguajes de programacion que tiene la capacidad de usarlo, tiene 1 o mas motores regex.

• Cuando se invoca a motor, se le pasa la porcion de dato (en java generalmente es String o stream) en la cual se quiere buscar y la expresion que se quiere encontrar.

Page 65: Capítulo VI - Strings, I/O,Formatting,and Parsing

Búsqueda Simple

• Uso de la clase Pattern y Matcher.• Se quiere buscar en un String los índices en donde esta el

texto que queremos encontrar.• Ver ejemplo Busqueda1.java

• OJO: Regla importante: Una vez que fue encontrado una coincidencia, no se volverá a usar ningun carácter de ese String para las busqueda siguientes.o Lo que se dice es que el patron a buscar fue “consumido”,

asi que no se puede volver a usar.• Ver ejemplo Busqueda2.java.

• Mas adelante se verá como romper esta regla.• Y que pasa si se quiere hacer busquedas dinamicas ???

Page 66: Capítulo VI - Strings, I/O,Formatting,and Parsing

Busquedas usando Meta-Caracteres

• Los metacaracteres son caracteres pasados que indican que se busca por 1 o mas caracteres.

• Asi:o \d: Numeroso \s: Espacios en blancoo \w: Caracteres, Numero y _ (subguion)o . : cualquier caracter

• Estos 3 son los que interesan para el examen.• Ver ejemplos MetaCaracter1.java

Page 67: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Tambien se pueden usar corchetes poniendo dentro lo que se quiera buscar.

• Ver ejemplo MetaCaracter2.java

Page 68: Capítulo VI - Strings, I/O,Formatting,and Parsing

Búsqueda usando cuantificadores

• Indican el numero de ocurrencias que se quiere buscar

• Ver ejemplo MetaCaracter3.java

• Ahora digamos que queremos buscar la ocurrencia de numeros, pero no de donde esta cada 1, sino donde empieza 1 numero.

• Los cuantificadores son:o + : 1 o maso * : 0 o maso ? : 0 o 1

• Ver ejemplo MetaCaracter4.java

Page 69: Capítulo VI - Strings, I/O,Formatting,and Parsing

Uso de ^

• Aunque no esta en el examen, hay un ejemplo del uso de este metacaracter

• Ver ejemplo MetaCaracter5.java

• La expresion ([^,])* se lee, dame cero o mas caracteres que no sean “,” (coma).

Page 70: Capítulo VI - Strings, I/O,Formatting,and Parsing

Búsqueda usando cuantificadores (cont…)

• Uso del carácter ?• Ver ejemplo MetaCaracter6.java

• Uso del . (punto)• Ver ejemplo MetaCaracter7.java

Page 71: Capítulo VI - Strings, I/O,Formatting,and Parsing

Cuantificadores Greedy

• ? es greedy, ?? es reluctant, para cero o uno• * es greedy, *? es reluctant, para cero o mas• + es greedy, +? es reluctant, para uno o mas

• Cuando es greedy, lee todo lo que se le pasó y la lectura del patrón la hace de derecha a izquierda. NO es que presenta lo que encontró desde la derecha.

• Cuando es reluctant, se lo hace normalmente de izquierda a derecha

Page 72: Capítulo VI - Strings, I/O,Formatting,and Parsing

Cuando Metacaracteres y String Colisionan

• En la vida real, se ha de querer poner la expresion en una variable.

• Primera regla, como los metacaracteres van con \, la representacion de este en java es \\

• Segunda, el . (punto) en regex significa cualquier carácter, para indicar el punto se usa “\.” lo que en java sería \\.

• Tambien puede ocurrir lo mismo cuando se quiera ahcer uso de la linea de comando, se aplica lo mismo con los \\.

• Ejemploo java DoRegex \\d o java DoRegex \d

Page 73: Capítulo VI - Strings, I/O,Formatting,and Parsing

Cuando Metacaracteres y String Colisionan (cont…)

Page 74: Capítulo VI - Strings, I/O,Formatting,and Parsing

Localizando Datos a traves de Pattern Matching

• Ver ejemplo Regex.java• Como ya hemos visto, el patron se lo saca del metodo

compile() de la clase Pattern.• El Matcher se lo obtiene del metodo matcher() del la

clase Pattern.• El metodo find() de la clase Matcher es el que se

encarga de hacer la busqueda y retorna verdadero o falso si es que ha encontrado una coincidencia con el patron.

• El metodo start() da el indice en donde inicia la coincidencia, el método end() da el índice despues del ultimo carácter de la coincidencia y el método group devuelve el string que se ha encontrado.

Page 75: Capítulo VI - Strings, I/O,Formatting,and Parsing
Page 76: Capítulo VI - Strings, I/O,Formatting,and Parsing

Busqueda usando la clase Scanner

• Esta hecha para el tokenizing de los datos pero también se la usa para búsquedas.

• No provee funcionalidad de información de posición o búsqueda y reemplazo.

• Se la puede usar para saber cuantas instancias del regex hay en una porción de datos.

• Ver ejemplo ScanIn.java

Page 77: Capítulo VI - Strings, I/O,Formatting,and Parsing

Tokenizing

• Es tomar una cantidad de datos, luego particionala en pedazos y almacenarlos en variables.

• El mas comun es String.split, pero Scanner tambien tiene esta capacidad.

Page 78: Capítulo VI - Strings, I/O,Formatting,and Parsing

Token y Delimitadores

• Token el pedazo de lo que se quiere el delimitador es la ezpresion de separacion de los pedazos.

• Un delimitador puede ser mas que un solo carácter, de hecho puede ser una regex.

• Ejemplo:o SI tenemos

ab,cd5b,6x,z4 Delimitador: ,

Resultado: ab – cd5b – 6x – z4 Delimitador: \d

Resultado: ab,cd – b, - x,z4

Page 79: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Tokenizing con String.split()o Ver ejemplo Token1.java

• Tokenizing con Scannero EL constructor acepta File, Stream o String como fuenteso Se lo hace son lazos, asi se puede parar en cualquier

momento.o Se puede saber que tipo de dato para el token es.o Los tokens pueden ser convertidos a sus primitivos

automaticamente.o El delimitador por default es “ “ (espacio)

o Ver ejemplo Token2.java

Page 80: Capítulo VI - Strings, I/O,Formatting,and Parsing

Formatiando con printf() y format()

• Como alinear los numeros con decimales• Como distinguir numeros negativos• Son cosas que se pueden manejar con el formato.• En java 5 fueron agreagados lso metodos printf() y

format() a la clase PrintStream, los dos trabajan exactamente igual.

• Forma:o printf("format string", argument(s));

Format String: puede tomar el formato que este asociado con el o los argumeto(s) y/o que no este asociado.

Argumet(s): Lo que se va a formatear.

Page 81: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Ejemplo:o System.out.printf("%2$d + %1$d", 123, 456);

Salida: 456 + 123

• Como esta constituido la sentencia del formatoo %[arg_index$][flags][width][.precision]conversion charo Los que estan entre corchete son opcionaleso O sea % y “conversion char” son obligatorios.

• En el ejmplo podemos deciro 1$ indica el primer argumento, 2$ el segundoo d el carácter de conversion

Page 82: Capítulo VI - Strings, I/O,Formatting,and Parsing

• Arg_index$o El numero del argumento a usar y que se va a imprimr en la

posicion en que se lo llama.• Flags

o "-" Alineacion a la izquierdao "+" Incluir un signo (+ or -) con este argumentoo "0" Llenar este argumento con ceroso "," Usar separador de grupo especifico (Eje: la coma en

123,456)o "(" Encerrar numero negativos en parentesis

• Widtho Para el numero minimo de caracteres, sirve para alinear.

Page 83: Capítulo VI - Strings, I/O,Formatting,and Parsing

• precision:o Indica en numero de decimales

• Conversiono El tipo de dato

b boolean c char d integer f floating point s string

Page 84: Capítulo VI - Strings, I/O,Formatting,and Parsing

Final

• OJO:o El uso de la aplicación de un mal formato puede arrojar la

exception java.util.IllegalFormatConversionException en tiempo ejecucion.