SlideShare a Scribd company logo
1 of 28
Download to read offline
Java World – Capítulo 6   2


                                                                                                                                       h
                                                                                                                                       t
                                                                                                                                       t
                                                                                                                                       p
                                                                                                                                       :
                                                                                                                                       /
                                                                                                                                       /
                                                                                                                                       g
                                                                                                                                       u
                                                                                                                                       s
                                                                                                                                       t
                                                                                                                                       a
                                                                                                                                       v
                                                                                                                                       o
                                                                                                                                       a
                                                                                                                                       l
Bienvenidos a una nueva edición de JavaWorld
                                                                                                                                       b
Le damos la bienvenida nuevamente a nuestros amigos de Valor Creativo “¡Leo, bienvenido a la vida real nuevamente!”.                   e
                                                                                                                                       r
En esta entrega nos estará hablando un poco sobre las expectativas en la industria de la informática. Muy útil para todos
                                                                                                                                       o
aquellos que se encuentren a un paso o dentro del ámbito de emprendedores.
                                                                                                                                       l
Volviendo a la certificación, empezaremos a adentrarnos en la API de Java especializada para la entrada y salida de datos. Si,         a
ahora podrás leer ese .txt con todos los teléfonos que sacaste el sábado y pasarlo a tu agenda desarrollada en Java.                   .
                                                                                                                                       b
Aprenderemos a persistir nuestros objetos con el modelo de serialización que nos propone de manera nativa Java, una utilidad           l
en principio para no depender de una base de datos, pero la cual tendrá un valor agregado cuando trabajemos enviando
                                                                                                                                       o
mensajes a través de internet con este mismo método ;)
                                                                                                                                       g
Ya estamos en la cuenta regresiva en las ediciones de JavaWorld, quedan solamente 4 capítulos. Aprovechen a sacarse sus                s
dudas, ya sea enviando comentarios o por email (los datos pueden obtenerlos en los blogs).                                             p
                                                                                                                                       o
Aprovechamos la oportunidad para agradecer el apoyo recibido por la comunidad y la buena onda para seguir adelante con este            t
proyecto.                                                                                                                              .
                                                                                                                                       c
                                                                                                                Gracias a todos.
                                                                                                                                       o
                                                                                                  El staff de revista JavaWorld
                                                                                                                                       m
3    Java World – Capítulo 6


h       La clase String
t       Como hemos mencionado en capítulos anteriores, la clase String no puede ser modificada. Entonces, ¿cómo es que podemos asociar
t       diferentes cadenas a una misma variable de tipo String?.
p
        String es un objeto inmutable
:
/       Inmutable… Que palabra. ¿Y qué quiere decir?
        Simple, exactamente que un objeto String no puede cambiar su valor, pero en ningún momento se menciona que una variable String
/
        no pueda apuntar a otro objeto.
v       Vamos a ver unos ejemplos para entenderlo mejor:
a
l         public class PruebasString_001 {
            static public void main(String[] args) {
o             String s1 = new String("Hola");
r             String s2 = "JavaWorld";
c                 System.out.println(s1);
r                 System.out.println(s2);
e
                  s1 = s1 + "-";
a                 s2 = s2.toUpperCase(); //Pasa a mayúsculas la cadena
t
                  System.out.println(s1);
i                 System.out.println(s2);
v
                  System.out.println(s1.concat(s2)); //concatena dos cadenas. Equivale a s1 + s2
o
.                 String s3 = s2;
b             }
          }
l
o
g
                           Hola
s                          JavaWorld
p                          Hola-
                           JAVAWORLD
o                          Hola-JAVAWORLD
t
.       Ahora puede que se estén preguntando “¿pero no dijo que un String era inmutable?”. Si, así es, pero reitero, nadie dice que una
c       variable de tipo String no pueda referenciar a otro objeto.
o       Veamos de manera gráfica el mapeo en memoria:

m
Java World – Capítulo 6   4

                                                                                                                                          h
              0000 – 000A         000B – 001F      0020 – 002C       002D - 0041          0042 - 0051                                     t
                  Hola             JavaWorld          Hola-          JAVAWORLD         Hola JAVAWORLD                                     t
                                                                                                                                          p
                                                                                                                                          :
                    s1                 s2                                      System.out.println(s1.concat(s2));
                                                                                                                                          /
                  Hola             JavaWorld                                                                                              /
                                                                                                                                          g
                                                                                                                                          u
              s1 = new String("Hola");                  s1                s2                      s3                                      s
              s2 = "JavaWorld";
                                                      Hola-          JAVAWORLD               JAVAWORLD
                                                                                                                                          t
      s1 = s1 + "-";
                                                                                                                                          a
      s2 = s2.toUpperCase();                                                                                                              v
                                                                                                                                          o
Cada carácter dentro de un String se encuentra en formato UFT-16. Las posiciones en memoria mostradas anteriormente son solo              a
para ejemplificar. El comportamiento del almacenamiento es dirigido por la JVM en conjunto con el Sistema Operativo.                      l
Cuando se inicializan las variables, se les asignan los valores “Hola” y “JavaWorld”, aquí es cuando creamos nuestros dos primeros        b
objetos de tipo String.                                                                                                                   e
Luego, a s1 le concatenamos “-“ y guardamos el resultado en la misma variable, lo que produce que se genere un nuevo objeto, y            r
actualizando la referencia para que apunte a este.                                                                                        o
A s2 lo transformamos en mayúsculas. Nuevamente se genera otro objeto, y almacenamos la referencia en s2.
                                                                                                                                          l
Y por último, generamos una salida en pantalla de s1 + s2. En este caso, también se genera un nuevo objeto, con la salvedad de que
la referencia no la captura nadie. Una vez que se mostró por pantalla esta variable es candidata a ser liberada por el garbage
                                                                                                                                          a
collector.                                                                                                                                .
Como podrán haber notado, en ningún momento se modificó ningún objeto que estuviera en memoria, pero si cambiaron las                     b
referencias de s1 y s2.                                                                                                                   l
Por último, cuando creamos un nuevo objeto (s3), y le asignamos el valor de s2, no se crea un nuevo objeto, se asigna la misma            o
posición de memoria.
                                                                                                                                          g
                         Cada vez que generen una nueva cadena, se genera un nuevo objeto String, siempre. La única excepción es
                                                                                                                                          s
                         cuando asignamos el valor de una variable String a otra. En este caso, las dos apuntan a la misma posición       p
                         de memoria.                                                                                                      o
                                                                                                                                          t
                                                                                                                                          .
String y la memoria                                                                                                                       c
Dado que una cadena es algo tan común, y para poder optimizar la memoria, la JVM reserva un área especial de la memoria                   o
denominada “String constant pool” (banco de constantes String). Cuando el compilador encuentra un literal de tipo String, verifica        m
en el banco si existe otra cadena idéntica. Si se encuentra una, directamente se referencia a esta, sino, se crea un nuevo objeto
String.

                      La clase String contiene el modificador de no acceso final. Esto quiere decir que no es posible sobre
                      escribir la clase.



Creación de cadenas
Existe una diferencia sutil entre crear un String mediante un literal y un objeto:
5    Java World – Capítulo 6

        String s1 = "JavaWorld"
h       Se crea una variable de referencia (s1) y un objeto String, el cual es almacenado en el banco de constantes String y asociado a s1.
t       String s2 = new String("JavaWorld")
t       Se crea una variable de referencia (s2). Como utilizamos la palabra clave new, se crea un objeto String fuera del banco de constantes
p       String y s2 referenciará a este. Luego, el literal “JavaWorld” es insertado en el banco.
:       Métodos de la clase String
/
        A continuación se nombran los métodos más utilizados de la clase String:
/
        Tipo de       Método                                      Descripción
v       valor
a       de retorno
l       char          charAt(int indice)                            Devuelve el carácter ubicado en el índice especificado.
o       String        concat(String str)                            Agrega un String al final de otro (equivalente a utilizar el +).
r       boolean       equalsIgnoreCase(String otroString)           Indica si dos cadenas son iguales, sin tener en cuenta mayúsculas.
c
        int           length()                                      Devuelve la cantidad de caracteres que contiene la cadena.
r
        String        replace(char       caracterViejo,     char    Reemplaza cada caracterViejo con el caracterNuevo.
e
                      caracterNuevo)
a
        String        substring(int inicioIndice, int finIndice)    Devuelve una nueva cadena con los caracteres comprendidos desde
t                                                                   inicioIndice hasta finIndice.
i       String        toLowerCase()                                 Convierte los caracteres en minúsculas.
v       String        toString()                                    Devuelve el valor de un String (dado que es un String, se devuelve a sí
o                                                                   mismo).
.       String         toUpperCase()                                Convierte los caracteres en mayúsculas.
        String         trim()                                       Elimina los espacios en blanco al comienzo y final de la cadena.
b
        Para más información pueden consultar la API de Java
l        “http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html”
o
g
s                            Hay que destacar que el tipo String tiene un método length(), y los arrays tienen un parámetro length.

p
o
t       StringBuffer y StringBuilder
.       Cuando vamos a utilizar muchas cadenas podemos utilizar las clases java.lang.StringBuffer o java.lang.StringBuilder. A diferencia de
c       String, con la cual si generaramos varias cadenas, se irían almacenando en el banco de constantes String, estas nuevas clases no se
o       almacenan en este último, sino que aprovechan el mismo espacio de memoria.
m       StringBuffer vs. StringBuilder
        La clase StringBuffer fue incorporada a partir de la versión 5 de Java. Posee exactamente la misma API que StringBuilder, salvo que
        esta última no es thread-safe (multihilo con seguridad). En otras palabras, los métodos no se encuentran sincronizados.
        Java recomienda siempre que sea posible, utilizar StringBuilder, dado que es mucho más veloz que su hermana StringBuffer. Solo



                             StringBuilder no es thread-safe.
                             StringBuffer si es thread-safe.
                             Ambas comparten la misma API.

        cuando necesitemos que sea thread-safe, utilizaremos StringBuffer.
Java World – Capítulo 6   6

Utilizando StringBuffer y StringBuilder                                                                                                 h
                                                                                                                                        t
  String s1 = "JavaWorld";                    //Se añade un String al banco de constantes String
  s1 += ". Vamos por más";                    //Se genera un nuevo String, y la referencia al anterior se pierde
                                                                                                                                        t
                                                                                                                                        p
  //Se crea un StringBuffer (no va al banco de constantes String)
  StrungBuffer s1 = new StringBuffer("JavaWorld");                                                                                      :
  s1.append(". Vamos por más");//Se modifica el mismo objeto                   (no se crea un nuevo String)                             /
Métodos importantes en las clases StringBuffer y StringBuilder                                                                          /
                                                                                                                                        g
Valor de retorno     Método                    Sobrecarga       Descripción                     Ejemplo
                                                                                                StringBuffer s = new
                                                                                                                                        u
StringBuffer/        append(String s)                SI         Concatena la cadena s a la
StringBuilder                                                   cadena dentro del objeto
                                                                                                StringBuffer("Quiero ser");             s
                                                                                                s.append(" un SCJP!");
                                                                (no es necesario atrapar la     //Quiero ser un SCJP!
                                                                                                                                        t
                                                                referencia para que el                                                  a
                                                                cambio se realice).                                                     v
StringBuffer/        delete(int     inicio,         NO          Elimina la subcadena dentro     StringBuffer s = new
                                                                                                StringBuffer("Quiero ser un             o
StringBuilder        int fin)                                   de la cadena del objeto         SCJP!");
                                                                                                s.delete(10, 13); //Quiero
                                                                                                                                        a
                                                                desde la posición inicio a la
                                                                                                ser SCJP!                               l
                                                                posición fin.
StringBuffer/        insert(int    indice,           SI         Inserta una nueva cadena (s)    StringBuffer s = new                    b
                                                                                                StringBuffer("Quiero SCJP");
StringBuilder        String s)                                  a partir de la posición         s.insert(7, "ser un ");                 e
                                                                indicada por índice dentro      //Quiero ser un SCJP                    r
                                                                de la cadena del objeto.                                                o
StringBuffer/        reverse()                      NO          Invierte la cadena.             StringBuffer s = new
                                                                                                StringBuffer("PJCS");                   l
StringBuilder                                                                                   s.revert(); //SCJP
                                                                                                                                        a
String               toString()                     NO          Devuelve un String con el       StringBuffer s = new
                                                                                                StringBuffer("SCJP");                   .
                                                                valor del objeto.               String s1 = s.toString();
                                                                                                //SCJP
                                                                                                                                        b
                                                                                                                                        l
                    Es posible que se encuentren en el examen con métodos encadenados, estos simplemente se resuelven de                o
                    derecha a izquierda, y el resultado de un método, es el objeto que utiliza el segundo.                              g
                                                                                                                                        s
Un ejemplo de equivalencias:                                                                                                            p
  StringBuffer s = new StringBuffer("Un SCJP");                                                                                         o
  s.reverse().delete(4, 7).append("... un que?").insert(0, "Quiero ser un ");                                                           t
  System.out.println(s); //Quiero ser un PJCS... un que?                                                                                .
  StringBuffer s2 = new StringBuffer("Un SCJP");                                                                                        c
  s2.reverse();                                                                                                                         o
  s2.delete(4, 7);
  s2.append("... un que?");                                                                                                             m
  s2.insert(0, "Quiero ser un ");
  System.out.println(s2); //Quiero ser un PJCS... un que?



                    StringBuffer y StringBuilder, al igual que String, no requieren ningún import.
7     Java World – Capítulo 6

        Navegación de archivos e I/O
h
t       El package java.io contiene una cantidad interesante de clases, pero para el examen, solo necesitaremos conocer algunas de ellas.
t       Solo se cubren los temas referidos a la entrada/salida de caracteres y serialización.
p
                             Cuando se utilice cualquier clase del package java.io, es necesario utilizar al comienzo del código la
:                            sentencia import, o hacer referencia al nombre completo de la clase:
/
/
v         //Con el import
a         import java.io.File;
l         //... Declaración de la clase y método main
          File file = new File("archivo.txt");
o
r         //Sin el import
          java.io.File file = new java.io.File("archivo.txt");
c
r
e       Descripción de las clases java.io para el examen
a
        Clase                       Descripción
t
        File                        Según la API “es una representación abstracta de rutas de directorios y archivos”. Aunque parezca
i
                                    extraño, esta clase no sirve para leer o escribir un archivo, sino que es utilizada a nivel de saber si existe un
v                                   archivo, crear o eliminar un archivo, crear un nuevo directorio.
o       FileReader                  Esta clase es utilizada para leer archivos de texto. El método read() permite un acceso a bajo nivel,
.                                   obteniendo un carácter, una determinada cantidad de estos, o todos los caracteres del archivo. Esta clase
b                                   generalmente es envuelta (wrapped) por otra clase, como un BufferedReader.
l       BufferedReader              Esta clase se utiliza para wrappear las clases de bajo nivel, como FileReader para volverlas más eficientes.
                                    En vez de leer carácter por carácter, lee una cantidad de estos y lo almacena en un buffer, cuando
o
                                    nosotros le pedimos el siguiente carácter, lo obtiene directamente del buffer y no de un archivo
g                                   (recuerden que en Sistemas Operativos, existe un mínimo de transferencia, a esta porción se la denomina
s                                   bloque, de manera que lo más óptimo sería transferir la información en un tamaño que sea un múltiplo de
p                                   dicho bloque).
o                                   También añade el método readLine() que permite leer una línea entera (hasta el próximo carácter de salto
t                                   de línea, o final de archivo, lo que se encuentre primero).
.       FileWriter                  Esta clase es utilizada para escribir archivos de texto. El método write() permite escribir caracteres o un
                                    String dentro de un archivo. Al igual que FileReader, esta clase es generalmente wrapped en otras clases
c
                                    como BufferedWriter.
o       BufferedWriter              Esta clase se utiliza para wrappear las clases de bajo nivel, como FileWriter para volverlas más eficientes.
m                                   Esta clase escribirá de a varios caracteres para reducir los tiempos de espera por almacenamiento en
                                    disco. También provee un método llamado newLine(), el cual genera el carácter de salto de línea
                                    correspondiente a la plataforma en donde se está corriendo la aplicación.
        PrintWriter                 Esta clase ha sido mejorada considerablemente a partir de la versión 5 de Java. Permite realizar acciones
                                    como format(), printf(), y append().
        Console                     Esta clase ha sido incorporada a partir de la versión 6 de Java. Provee métodos para leer desde consola y
                                    escribir en ella.
Java World – Capítulo 6   8

Api de las clases java.io para el examen                                                                                                       h
Clase                      Extends         Constructores                           Métodos                                                     t
File                       Object          (File f, String s)                      createNewFile() : boolean                                   t
                                           (String s)                              delete() : boolean
                                           (String s, String s)                    exists() : boolean
                                                                                                                                               p
                                                                                   isDirectory() : boolean                                     :
                                                                                   isFile() : boolean
                                                                                                                                               /
                                                                                   list() : String[]
                                                                                   mkdir() : boolean                                           /
                                                                                   renameTo(File destino) : boolean                            g
                                           (File f)                                read() : int
                                                                                                                                               u
FileReader                 Writer
                                           (String s)                                                                                          s
                                                                                                                                               t
BufferedReader             Reader          (Reader r)                              read() : int
                                                                                   readLine() : String
                                                                                                                                               a
FileWriter                 Writer          (File f)                                close() : void                                              v
                                           (String s)                              flush() : void
                                                                                                                                               o
                                                                                   write(char[] cbuf) : void
                                                                                   write(String cbuf) : void                                   a
BufferedWriter             Reader          (Writer wr)                             close() : void                                              l
                                                                                   flush() : void
                                                                                   write(char[] cbuf) : void                                   b
                                                                                   write(String cbuf) : void                                   e
                                                                                   newLine() : void
PrintWriter                Writer          (File f) //Desde Java 5                 close() : void                                              r
                                           (String s)//Desde Java 5                flush() : void                                              o
                                           (OutputStream ou)                       format()
                                           (Writer wr)                             printf()
                                                                                                                                               l
                                                                                   print()                                                     a
                                                                                   println()
                                                                                                                                               .
                                                                                   write()
Console                                                                                                                                        b
                                                                                                                                               l
                                                                                                                                               o
                      Dentro del package java.io encontramos dos grandes grupos de clases, aquellas que contienen las palabras
                                                                                                                                               g
                      InputStream o OutputStream, y aquellas otras que contienen Read o Write.
                                                                                                                                               s
Las primeras son utilizadas a nivel de bytes, las últimas a nivel de caracteres.                                                               p
                                                                                                                                               o
Creación de archivos a través de la clase File
                                                                                                                                               t
Estos objetos son utilizados para representar archivos (pero no su contenido) o directorios.                                                   .
                                                                                                                                               c
  import java.io.File; //También es válido escribir: import java.io.*                                                                          o
  public class PruebasFiles_001 {
                                                                                                                                               m
    static public void main(String[] args) {
      File file = new File("archivo_001.txt");
    }
  }
Vamos a empezar con un poco de código:
Invito al lector si tiene una computadora con la JDK (no JRE) a mano a compilar y ejecutar este código (llamen a la clase
PruebasFiles_001.java).
Si realizaste la tarea anterior, puede que hayas ido corriendo al directorio a buscar tu nuevo archivo recién creado… pero… ¿dónde
está?, no lo encuentro por ninguna parte.
El código anterior no crea ningún archivo, sino que crea un objeto el cual tiene establecido un path (ruta), o nombre de archivo.
9    Java World – Capítulo 6

        Pero, con dicha ruta, podemos llegar a crear un archivo. Veamos:
h
t
t        import java.io.File; //También es válido escribir: import java.io.*
         import java.io.IOException; //Si utilizaste import.java.io.*, no es necesaria esta
p        línea
:
         public class PruebasFiles_001 {
/          static public void main(String[] args) {
/            try {
               File file = new File("archivo_001.txt");
v
a                 boolean      esArchivoNuevo = false;
l
                   //El método exists() devuelve un boolean indicando si existe o no el archivo
o                  System.out.println("Existe el archivo: " + file.exists());
r                  esArchivoNuevo = file.createNewFile();
                   System.out.println("Es nuevo el archivo: " + esArchivoNuevo);
c                  System.out.println("Existe el archivo: " + file.exists());
r                } catch(IOException ex) {
                   System.out.println("Ocurrio un error: " + ex);
e
                 }
a            }
t        }
i       Cuando ejecutemos el programa por primera vez recibiremos lo siguiente:
v
                            Existe el archivo: false
o                           Es nuevo el archivo: true
.                           Existe el archivo: true
b       En la segunda ejecución recibiremos una respuesta diferente:
l
                            Existe el archivo: true
o                           Es nuevo el archivo: false
g                           Existe el archivo: true
s       En la primer ejecución, cuando verificamos si existe el archivo, devuelve false, luego lo creamos, y al verificar nuevamente por su
p       existencia, indica que sí existe.
o       En la segunda ejecución, cuando verificamos si existe el archivo, nos encontramos con un true (lo creamos pero nunca lo
t       destruimos). Cuando intentamos volver a crearlo, devuelve un false, esto es porque el método createNewFile() intenta crear el
        archivo, si pudo crearlo devuelve true, sino devuelve false, en este caso, como ya existía, no sobreescribe, sino que no produce
.
        ninguna acción. Y al verificar nuevamente por el archivo, sigue estando (que sorpresa, no?!).
c
o
m
Java World – Capítulo 6      10

Utilizando FileWriter y FileReader                                                                                                          h
En la práctica, es muy poco común utilizar estas clases sin wrappers, pero de todas maneras, veamos un ejemplo.                             t
                                                                                                                                            t
  import    java.io.IOException;
  import    java.io.FileReader;                                                                                                             p
  import    java.io.FileWriter;                                                                                                             :
  import    java.io.File;
                                                                                                                                            /
  public class PruebasFiles_002 {                                                                                                           /
    static public void main(String[] args) {
                                                                                                                                            g
      char[] bufferLectura = new char[50];
      int tamanio = 0;                                                                                                                      u
                                                                                                                                            s
          try {
            File file = new File("archivo.txt");                                                                                            t
            FileWriter fw = new FileWriter(file);                                                                                           a
           fw.write("Quiero ser un SCJP");                                                                                                  v
           fw.flush();                                                                                                                      o
           fw.close();
                                                                                                                                            a
            FileReader fr = new FileReader(file);                                                                                           l
            tamanio = fr.read(bufferLectura);                                                                                               b
            System.out.println("Tamaño del archivo: " + tamanio + " bytes.");
            for(char c : bufferLectura) {                                                                                                   e
              System.out.print(c);                                                                                                          r
            }
            fr.close();                                                                                                                     o
          } catch(IOException ex) {                                                                                                         l
            System.out.println("Ocurrio un error: " + ex);                                                                                  a
          }
      }                                                                                                                                     .
  }                                                                                                                                         b
                                                                                                                                            l
                                                                                                                                            o
                                                                                                                                            g
                   Tamaño del archivo: 18 bytes.                                                                                            s
                   Quiero ser un SCJP
                                                                                                                                            p
                                                                                                                                            o
Si abrimos el archivo, nos encontraremos con esta misma línea “Quiero ser un SCJP”.                                                         t
                                                                                                                                            .
Combinando clases de entrada/salida
                                                                                                                                            c
Todo el package de java.io fue diseñado para utilizarse en combinación entre clases. Combinando las clases se lo suele llamar:              o
wrapping, o decorando.                                                                                                                      m


                     Para aquellos que se encuentren familiarizados con los patrones de diseño, les será más fácil entender que
                     todo el modelo de clases de java.io se basa en el patrón Decorador.

Para aquellos que no tengan ni idea de que estoy hablando, les dejo el link al blog de un profesor de la cátedra de Metodologías de
Sistemas, en donde explica dicho patrón.
http://metodologiasdesistemas.blogspot.com/search/label/decorador
No es necesario que conozcas el patrón (no a fines de rendir la certificación SCJP), pero para quien le interese, nunca está de más.
11    Java World – Capítulo 6

         El decorado de un objeto siempre se realiza de los más elementales, a los más abstractos. Veamos un ejemplo:
h
t          import    java.io.File;
           import    java.io.FileWriter;
t          import    java.io.BufferedWriter;
p          import    java.io.IOException;
:          public class PruebasFiles_003 {
/            static public void main(String[] args) {
/              File file = new File("PruebasFiles_003.txt");
               try {
v                FileWriter fw = new FileWriter(file);
a                BufferedWriter bf = new BufferedWriter(fw);
l                   bf.write("Soy una clase decoradora!");
o                   bf.newLine();
                    bf.write("Estoy en otra la");
r
c                    bf.flush();
r                    bf.close();
                   } catch(IOException ex){
e                    System.out.println("Ocurrio un error:" + ex);
a                  }
               }
t          }
i
v        En este caso, el BufferedWriter decora al FileWriter, y este a su vez decora a File.
o
.                              En este caso, al crear el FileWriter se crea el archivo, pero no el directorio. Si el archivo esta contenido
b                              dentro de un directorio que no existe se generará una excepción IOException.
l
o
         Trabajando con archivos y directorios
g
s        Básicamente, trabajar con archivos es casi lo mismo que con directorios, dado que para Java, un directorio no es más que un objeto
         de tipo File que referencia a un Directorio.
p
o          import java.io.File;
           import java.io.IOException;
t
.          public class PruebasFiles_004 {
             static public void main(String[] args) {
c              File dir = new File("carpeta");
o              dir.mkdir(); //Genera el directorio carpeta
m
                   //Crea un archivo que se encuentra en el directorio carpeta
                   File file = new File(dir, "archivo.txt");
                   try {
                     file.createNewFile(); //Crea el archivo archivo.txt
                   } catch(IOException ex){}
               }
           }
Java World – Capítulo 6      12

También podemos listar todo el contenido de un directorio:                                                                                   h
  import java.io.File;                                                                                                                       t
  import java.io.IOException;
                                                                                                                                             t
  public class PruebasFiles_005 {//throws IOException {                                                                                      p
    static public void main(String[] args) {                                                                                                 :
      File file = new File(".");
      String[] s = file.list();                                                                                                              /
                                                                                                                                             /
          for (String str : s) {
            System.out.println(str);                                                                                                         g
          }                                                                                                                                  u
      }
                                                                                                                                             s
  }
                                                                                                                                             t
                                                                                                                                             a
Java.io.Console
                                                                                                                                             v
A partir de Java 6 encontramos dentro del package java.io la clase Console. Esta sirve para obtener la instancia de la consola en que        o
se ejecuta la aplicación, siempre que esta sea una aplicación de consola.
                                                                                                                                             a
En caso de que no lo sea, al intentar invocar un objeto de este tipo, recibiremos un valor null.
                                                                                                                                             l
Los métodos de Console:
                                                                                                                                             b
          flush() : void                                                                                                                    e
          format(String fmt, Object... args) : Console                                                                                      r
          printf(String format, Object... args) : Console                                                                                   o
          reader() : Reader
                                                                                                                                             l
          readLine() : String
                                                                                                                                             a
          readLine(String fmt, Object... args) : String
          readPassword() : char[]
                                                                                                                                             .
          readPassword(String fmt, Object... args) : char[]                                                                                 b
          writer() : PrintWriter                                                                                                            l
                                                                                                                                             o
 import java.io.Console;                                                                                                                     g
 import java.util.Arrays;
                                                                                                                                             s
 public class PruebasFiles_006 {                                                                                                             p
   static public void main(String[] args) {
     Console console = System.console();                                                                                                     o
     if (console != null) {                                                                                                                  t
       char[] pass;
       char[] realpass = {'e', 'n', 't', 'r', 'a', 'd', 'a'};                                                                                .
                                                                                                                                             c
           pass = console.readPassword("%s", "password: ");
           console.format("%s", "your password: ");                                                                                          o
           for(char c : pass) {
             console.format("%c", c);
                                                                                                                                             m
           }
           console.format("%s", "n");

            if (Arrays.equals(pass, realpass)) {
              console.format("%s", "Bienvenido...");
            } else {
              console.format("%s", "Lo lamento... Pero no vas a entrar!");
            }
          } else { //if (console != null) {
            System.out.println("No se pudo obtener la instancia de la consola.");
          }
      }
 }
13    Java World – Capítulo 6


h
         El método format será explicado más adelante.
t
t        Serialización de objetos
p        La serialización de un objeto es el almacenamiento del estado de este. Recordemos que cuando nos referimos a estado, hablamos
:        de los atributos de un objeto.
/        Por defecto, todos los atributos de un objeto serán serializados, a menos que estos se marquen con el modificador de no acceso
         transient.
/
v
a                             La serialización de un objeto almacena el estado del objeto, pero no de la clase, es decir, si hay atributos
                              static, estos no serán serializados.
l
o
r        ObjectOutputStrem y ObjectInputStream
c
         Estas clases poseen dos métodos con los que tendremos que trabajar:
r
e               ObjectOutputStream.writeObject();
a               ObjectInputStream.readObject();
t
i          import java.io.File;
           import java.io.ObjectOutputStream;
v          import java.io.ObjectInputStream;
o          import java.io.FileOutputStream;
.          import java.io.FileInputStream;
           import java.io.IOException;
b          import java.io.Serializable;
l          //import java.lang.ClassNotFoundException; //No es necesario el import
o          public class PruebasSerialize_1 {
g            static public void main(String[] args) {
               File file = new File("PruebasSerialize_Pruebas.obj");
s
               //Creamos el objeto
p              Pruebas prueba = new Pruebas(45, 30);
o
                 //Lo serializamos
t                try {
.                  FileOutputStream fs = new FileOutputStream(file);
                   ObjectOutputStream ou = new ObjectOutputStream(fs);
c                  ou.writeObject(prueba);
o                  ou.close();
                 } catch(IOException ex) {
m                  System.out.println("Ocurrio un error: " + ex);
                 }

                 //Establecemos el objeto a null para comprobar que realmente lo estamos leyendo.
                 prueba = null;
Java World – Capítulo 6     14


 //Lo deserializamos                                                                                                                    h
     try {                                                                                                                              t
       FileInputStream fi = new FileInputStream(file);
       ObjectInputStream oi = new ObjectInputStream(fi);                                                                                t
       prueba = (Pruebas) oi.readObject();                                                                                              p
       oi.close();
     } catch(IOException ex) {
                                                                                                                                        :
       System.out.println("Ocurrio un error: " + ex);                                                                                   /
     } catch(ClassNotFoundException ex) {                                                                                               /
       System.out.println("No es posible encontrar la clase: " + ex);
     }                                                                                                                                  g
     //Mostramos el objeto por pantalla para verificar que se obtuvieron los datos                                                      u
     System.out.println(prueba);
   }                                                                                                                                    s
 }                                                                                                                                      t
 //Es necesario implementar la interface Serializable
 class Pruebas implements Serializable {
                                                                                                                                        a
   int width;                                                                                                                           v
   int height;                                                                                                                          o
     public Pruebas (int width, int height) {                                                                                           a
       this.width = width;                                                                                                              l
       this.height = height;
     }                                                                                                                                  b
                                                                                                                                        e
     public String toString() {
       return "width:" + width + "-height:" + height;
                                                                                                                                        r
     }                                                                                                                                  o
 }                                                                                                                                      l
                                                                                                                                        a
                     Serializable es una interfaz constructora. No tiene métodos para implementar.                                      .
                                                                                                                                        b
                                                                                                                                        l
                                                                                                                                        o
Gráfico de objetos                                                                                                                      g
Supongamos que tenemos la siguiente estructura de objetos:                                                                              s
                                                                                                                                        p
                                                                                                                                        o
                          Aerolinea                        Avion                           Piloto                                       t
                                                                                                                                        .
                       Dependencia
                                                                                                                                        c
Y quisiéramos serializar nuestro objeto Aerolinea, podríamos pensar que hay que serializar el piloto, luego el avión, y luego la        o
aerolínea. Imaginen si el árbol de clases se duplica.                                                                                   m
De manera que Java ideó una solución, si serializamos un objeto que contenga dependencias a otro objeto, la serialización se
produce en cadena.
Pero hay un pequeño inconveniente. Como vimos anteriormente, para poder serializar un objeto, este debe de implementar
Serializable, si se genera una serialización en cadena, todas las clases afectadas deben de implementar serializable.
Ejemplo completo: http://thechroniclesofbinary.googlecode.com/files/PruebasSerialize_2.java
Compilar: javac –g PruebasSerialize_2.java
15    Java World – Capítulo 6

         writeObject y readObject
h
t        Java posee un mecanismo que permite generar una serie de métodos privados, los cuales, si existen, serán invocados durante la
t        serialización y deserialización.

p        Más patrones. Lo que estamos viendo en este caso es un ejemplo del patrón template.
:        http://metodologiasdesistemas.blogspot.com/search/label/decorador
/        Nuevamente, no es necesario conocer este patrón (no a fines de rendir la certificación SCJP)

/        La firma de los métodos son:
v
                  private void writeObject(ObjectOutputStream os)
a
                  private void readObject(ObjectInputStream is)
l
o        Veamos un ejemplo de una situación donde esto sería útil:
r        Supongamos que poseemos las siguientes 2 clases, pero “ClaseIncognita” es una clase cuyo fuente no tenemos (esto es muy
         probable cuando utilices librerías de terceros).
c
r          //Clase incógnita. Solo conocemos la firma de su constructor y método
e          ClaseIncognita(int valor);   //Firma constructor
           int getValor();        //Firma método
a
t          //Y tenemos nuestra clase que utiliza ClaseIncognita
           class ClaseConocida implements Serializable {
i            private ClaseIncognita claseIncognita;
v            private int otroValor;
o              public ClaseConocida(int otroValor, ClaseIncognita clase) {
.                this.otroValor = otroValor;
b                claseIncognita = clase;
               }
l
o              public int getOtroValor() {
                 return otroValor;
g              }
s
               public int getValor() {
p                int valor = -1;
o                if (claseIncognita != null) //Código defensivo
t                  valor = claseIncognita.getValor();
                 return valor;
.              }
c          }
o
m        Los desarrolladores de la librería indicaron que ClaseIncognita no es serializable, pero si nosotros quisiéramos serializar
         ClaseConocida estaríamos en problemas. Como vimos, la serialización se genera en cadena, de manera que cuando llegue a
         ClaseIncognita, y se encuentre con que no implementa serializable, tendremos un hermoso NotSerializableException.
         Veamos como solucionamos esto:
Java World – Capítulo 6       16

                                                                                                                                                             h
  //AGREGAMOS A LA CLASE ClaseConocida LOS SIGUIENTES MÉTODOS
                                                                                                                                                             t
  //Implementamos los métodos readObject y writeObject                                                                                                       t
  //throws IOException
  private void readObject(ObjectInputStream is) {                                                                                                            p
    try {                                                                                                                                                    :
        is.defaultReaderObject();
                                                                                                                                                             /
        claseIncognita = new ClaseIncognita(is.readInt());
    } catch(IOException ex) {                                                                                                                                /
        System.out.println("Error al intentar serializar el objeto: " + ex);                                                                                 g
    } catch(ClassNotFoundException ex) {
        System.out.println("La clase solicitada no fue localizada: " + ex);                                                                                  u
    }                                                                                                                                                        s
  }
                                                                                                                                                             t
  //throws IOException, ClassNotFoundException                                                                                                               a
  private void writeObject(ObjectOutputStream os) {
                                                                                                                                                             v
    try {
      os.defaultWriteObject();                                                                                                                               o
      os.writeInt(claseIncognita.getValor());                                                                                                                a
    } catch(IOException ex) {
      System.out.println("Error al intentar serializar el objeto: " + ex);                                                                                   l
    }                                                                                                                                                        b
  }
                                                                                                                                                             e
                                                                                                                                                             r
Cuando se llama a la serialización, se invoca el método writeObject, el cual hace lo siguiente:
                                                                                                                                                             o
    1.   invoca el método defaultWriteObject. Esto le indica a la clase que se serialice normalmente.                                                        l
    2.   Agrena un valor de tipo int luego de la serialización del objeto.                                                                                   a
                                                                                                                                                             .
Cuando se llama a la deserialización, se invoca el método readObject, el cual hace lo siguiente:
                                                                                                                                                             b
    1.   Invoca el método defaultReadObject. Esto le indica a la clase que se deserialice normalmente.                                                       l
    2.   Lee un carácter de tipo int luego de la deserialización.                                                                                            o
Esto es posible gracias a que los streams al leer los datos llevan un puntero. Cuando nosotros serializamos estamos diciendo por
                                                                                                                                                             g
ejemplo: los 48 caracteres que acabo de escribir son del objeto serializado. Luego le decimos, agregate un int (4 bytes).                                    s
Cuando hay que deserializarlo le decimos a la clase que lo haga de forma automática (esto quiere decir que va a leer los primeros 48                         p
caracteres para regenerar la clase). Luego, sabemos que colocamos un int luego de estos, así que lo leemos.                                                  o
Es muy importante respetar el orden de almacenamiento, junto con los tipos de datos (recuerda que según el tipo es el tamaño del                             t
mismo, y los streams trabajan en bytes).
                                                                                                                                                             .
Pero este código aun no funciona… ¿Perdón?
                                                                                                                                                             c
No pusimos el atributo claseIncognita con el modificador de no acceso transient.
Ejemplo completo: http://thechroniclesofbinary.googlecode.com/files/PruebasSerialize_3.java                                                                  o
Compilar: javac –g PruebasSerialize_3.java                                                                                                                   m

                      Si la clase padre implementa la interfaz Serializable, la clase hija implícitamente será también serializable, por más que
                      esta no la implemente. Si recordamos las propiedades de herencia y polimorfismo es fácil darnos cuenta de ello.
                      Si recuerdan, en capítulos anteriores hemos hablado de la manera en que se invocaba un método, y las llamadas que
                      este producía.
                      En el caso de Serializable, es totalmente diferente:
                      Cuando un objeto es creado a raíz de una deserialización, no se invoca a ningún constructor (ni clase ni superclases), ni
                      se le dan valores por defecto a todos sus atributos.
                      Si la clase hija implementa Serializable, pero no la clase padre, solo se serializan los atributos de la clase hija, y el padre
                      inicia con los valores por defecto de cada tipo primitivo.
17     Java World – Capítulo 6

         Fechas, números y monedas
h
t        La API de Java provee un set bastante extenso de clases para realizar tareas con fechas, números y monedas, pero para el examen
t        solo es necesario conocer las más comunes de estas.
         Estos conceptos lo que harán será adentrarnos un poco en el mundo de la internacionalización, o más bien conocido como i18n (una
p
         manera de abreviar palabras es escribiendo la primer letra y la última, y en medio, la cantidad de caracteres que hay entre medio, de
:
         manera que JavaWorld se escribiría j7d).
/        Para este fin debemos de conocer algunas clases de los package java.util y java.text:
/        package Clase                 Desc.
v        java.util     Date              La mayoría de los métodos de esta clase han quedado en desuso, pero es posible utilizarla como
a                                        puente entre Calendar y DateFormat. Una instancia de Date representa una fecha y hora determinada,
l                                        expresada en milisegundos (formato de fecha UNIX).
         java.util     Calendar          Esta clase provee una gran variedad de métodos que permiten la manipulación y conversión de fechas
o
                                         y horas.
r
         java.text     DateFormat        Esta clase no solo permite dar un formato a la fecha como Enero 2, 2009, sino que también permite
c                                        formatear según la configuración regional.
r        java.text     NumberFormat      Esta clase es utilizada para formatear la moneda por configuraciones regionales.
e        java.util     Locale            Esta clase se utiliza en conjunto con DatoFormat y NumberFormat para formatear fechas, números y
a                                        monedas para una región específica.
t        La clase Date
i        La clase Date se encuentra en desuso debido a que durante su diseño, no se tuvo en cuenta la i18n.
v        De todas maneras, la clase Date se encuentra en el examen por las siguientes razones:
o
                    Es muy factible encontrarla en código antiguo.
.
                    Es sencillo si lo que se busca es una manera rápida y simple de obtener fechas.
b                   Cuando se requiere solo una fecha universal.
l                   Es utilizada como puente entre las clases Calendar y DateFormat.
o
g        Esta clase contiene un long que representa los milisegundos desde el 01/01/1970 (también conocido como formato UNIX o POSIX).
         Método/Constructor              Descripción                                                Ejemplo
s
         Date()                              Constructor que crea un objeto Date con la fecha actual.   Date date = new Date();
p                                                                                                       Date date = new Date(1000000L);
         Date(long fecha)                    Constructor que crea un objeto Date con la fecha
o                                            especificada.
t        getTime()                           Obtiene la fecha del objeto Date.                          Date date = new Date();
                                                                                                        long l = date.getDate();
.
c        setTime(long fecha)                 Establece la nueva fecha para el objeto Date.              Date date = new Date();
                                                                                                        date.setDate(1234L);
o
m        La salida estándar de Date es “*Mes+ *Día+ *Hora+:*Minutos+:*Segundos+ MDT *Año+”.
         Ejemplo: Jan 08 21:12:45 MDT 2009.

         La clase Calendar


                                  Calendar es una clase abstracta, de manera que no puedes crear una instancia de Calendar con un new.


         Calendar se encuentra diseñada con el patrón Singleton.
         Para lo que deseen saber acerca del mismo pueden consultar http://es.wikipedia.org/wiki/Singleton.
         La finalidad de este es que solo exista una única instancia de esta clase.

         Calendar posee un enum para indicar si se trata de meses, días, semanas, años, y otros. Pueden ver la lista completa en la doc. de la
         API de Java en:
         http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html
Java World – Capítulo 6       18

Método/Constructor                    Descripción                           Ejemplo                                                    h
Calendar.getInstance()                Constructor que devuelve una          Calendar            calendario                    =
                                                                            Calendar.getInstance();                                    t
                                      instancia de Calendar con fecha
                                                                                                                                       t
                                      01/01/1970.
Calendar.getInstance(Locale region)   Constructor que devuelve una          Locale region = new Locale("es");                          p
                                                                            Calendar calendario =
                                      instancia de Calendar con fecha       Calendar.getInstance(region);                              :
                                      01/01/1970          con        una                                                               /
                                      configuración regional específica.                                                               /
setTime(Date fecha)                   Establece la fecha obteniendo la      calendario.setDate(fecha);
                                                                                                                                       g
                                      misma de un objeto Date.
                                                                            calendario.getDate();
                                                                                                                                       u
getDate()                             Obtiene la fecha recibiendo un
                                      objeto de tipo Date.
                                                                                                                                       s
getFirstDayOfWeek()                   Obtiene según la configuración        calendario.getFirstDayOfWeek();                            t
                                      regional, cual es el primer día de                                                               a
                                      la semana.                                                                                       v
add(int part, int cant)               Añade la cantidad especificada a      calendario.add(Calendar.MONTH, 5);
                                                                                                                                       o
                                      la parte indicada. Part se
                                                                                                                                       a
                                      especifica      mediante         un
                                                                                                                                       l
                                      enumerador y puede representar
                                      un día, mes, año, o cualquier otro.                                                              b
roll(int part, int cant)              Actua similar a add, salvo que las    calendario.roll(Calendar.MONTH, 5);                        e
                                      partes mayores no se modifican.                                                                  r
                                      Ejemplo:si modificamos los días,                                                                 o
                                      por más que agrguemos 100, el                                                                    l
                                      més y año seguirán siendo los
                                                                                                                                       a
                                      mismos.
                                                                                                                                       .
                                                                                                                                       b
                                                                                                                                       l
                                                                                                                                       o
                                                                                                                                       g
                                                                                                                                       s
                                                                                                                                       p
                                                                                                                                       o
                                                                                                                                       t
                                                                                                                                       .
                                                                                                                                       c
                                                                                                                                       o
                                                                                                                                       m
19    Java World – Capítulo 6

         La clase DateFormat
h
t        Al igual que Calendar, DateFormat es una clase abstracta, de manera que solo puedes obtener una instancia de la misma a través de
t        métodos de clase.
         Constructor
p
         DateFormat.getInstance()
:
         DateFormat.getDateInstance()
/        DateFormat.getDateInstance(int format)
/        DateFormat.getDateTimeInstance()
v        DateFormat.getDateTimeInstance(int format)
a        Un ejemplo de formateo:
l
           import java.util.Date;
o          import java.text.DateFormat;
r
           //Configuración regional Calendario Griego – GMT -03:00
c
r          public class PruebasFormat_002 {
e            static public void main(String[] args) {
               Date fecha = new Date();
a              DateFormat[] formats = new DateFormat[6];
t              formats[0] = DateFormat.getInstance();
               formats[1] = DateFormat.getDateInstance();
i              formats[2] = DateFormat.getDateInstance(DateFormat.SHORT);
v              formats[3] = DateFormat.getDateInstance(DateFormat.MEDIUM);
               formats[4] = DateFormat.getDateInstance(DateFormat.LONG);
o              formats[5] = DateFormat.getDateInstance(DateFormat.FULL);
.
b                      for(DateFormat df : formats) {
                         System.out.println(df.format(fecha));
l                      }
o                  }
           }
g
s
                                  28/12/09 17:53
p                                 28/12/2009
o                                 28/12/09
                                  28/12/2009
t                                 28 de diciembre de 2009
.                                 lunes 28 de diciembre de 2009
c
o
         La clase Locale
m
         La API dice que la clase Locale es “una ubicación geográfica, políticam o región cultural”.
         Para el examen, solo necesitamos saber los siguientes constructores:

                      Locale(String idioma)
                      Locale(String idioma, String ciudad)

         Y los métodos:

                      getDisplayCountry()
                      getDisplayCountry(Locale ubicacion)
                      getDisplayLanguage()
                      getDisplayLanguage(Locale ubicacion)

         El idioma representa un código establecido en la norma ISO 639.
Java World – Capítulo 6      20

                       Tanto DateFormat como NumberFormat pueden recibir como parámetro un objeto Locale en momento de                      h
                       la instanciación. Pero una vez instanciado este, no hay ningún método para cambiar la configuración                  t
                       geográfica.                                                                                                          t
                                                                                                                                            p
                                                                                                                                            :
La clase NumberFormat
                                                                                                                                            /
NumberFormat también es una clase abstracta, así que no intentes ningún new con esta.                                                       /
Método/Constructor                                               Descripción
                                                                                                                                            g
NumberFormat.getInstance()                                         Obtiene una instancia con la configuración regional por defecto.
                                                                                                                                            u
NumberFormat.getInstance(int region)                               Obtiene una instancia con la configuración regional especificada.
NumberFormat.getCurrencyInstance()                                 Obtiene la instancia de la moneda para la configuración regional         s
                                                                   por defecto.                                                             t
NumberFormat.getCurrencyInstance(int región)                       Obtiene la instancia de la moneda para la configuración regional         a
                                                                   especificada.                                                            v
getMaximunFractionDigits()                                         Obtiene la cantidad máxima de decimales en la fracción.                  o
setMaximunFractionDigits(int digitos)                              Establece la cantidad máxima de decimales en la fracción.
                                                                                                                                            a
parse() : throws ParseException                                    Parsea un String.
                                                                                                                                            l
setParseIntegerOnly(boolean soloInteger)                           Establece si se obtiene solo la parte entera, o también la parte
                                                                   decimal.                                                                 b
                                                                                                                                            e
Tablas de resumen
                                                                                                                                            r
Tabla en la que se resumen todas las instanciaciones o creaciones:                                                                          o
Clase                                     Costructor o método de creación                                                                   l
java.util.Date                             new Date();
                                           new Date(long milisegundosDesde01011970);                                                        a
java.util.Calendar                         Calendar.getInstance();
                                           Calendar.getInstance(Locale region);                                                             .
java.util.Locale                           Locale.getDefault();                                                                             b
                                           new Locale(String idioma);
                                           new Locale(String idioma, String ciudad);                                                        l
java.text.DateFormat                       DateFormat.getInstance();
                                           DateFormat.getDateInstance(int estilo);                                                          o
                                           DateFormat.getDateInstance(int estilo, Locale region);
java.text.NumberFormat                     NumberFormat.getInstance();                                                                      g
                                           NumberFormat.getInstance(Locale region);
                                           NumberFormat.getNumberInstance();
                                                                                                                                            s
                                           NumberFormat.getNumberInstance(Locale region);                                                   p
                                           NumberFormat.getCurrencyInstance();
                                           NumberFormat.getCurrencyInstance(Locale region);                                                 o
Tabla en la que se resuelven los usos más comunes para las clases anteriores:                                                               t
Caso                                               Pasos
                                                    Date fecha = new Date();
                                                                                                                                            .
Obtener la fecha y hora actuales.
                                                    String fechaStr = fecha.toString();                                                     c
Obtener un objeto que permita realizar cálculos     Calendar cal = Calendar.getInstance();
                                                    cal.add(Calendar.MONTH, 3);                                                             o
de fecha y hora en la configuración regional por    cal.roll(Calendar.YEAR, 1);
                                                                                                                                            m
defecto.
Obtener un objeto que permita realizar cálculos     Locale region = new Locale("en", "US");
                                                    Calendar cal = Calendar.getInstance(region);
de fecha y hora en cualquier configuración          cal.add(Calendar.MONTH, 3);
regional.                                           cal.roll(Calendar.YEAR, 1);

Obtener un objeto que permita realizar cálculos     Calendar cal = Calendar.getInstance();
                                                    Date fecha = cal.getDate();
de fecha y hora, y luego formatear la salida para   Locale region = new Locale("en", "US");
diferentes regiones con diferentes formatos de      DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, region);
                                                    String fechaStr = df.format(fecha);
salida.
Obtener un objeto que permita formatear             Locale region = new Locale("en", "US");
                                                    float valor = 123.4567f;
números o monedas entre varias regiones.            NumberFormat nf1 = NumberFormat.getInstance(region);
                                                    NumberFormat nf2 = NumberFormat.getCurrencyInstance(region);
                                                    String valor1 = nf1.format(valor1);
21        Java World – Capítulo 6

                                                            String valor2 = nf2.format(valor2);
h
         Búsqueda y parseo dentro de Strings
t
t        Para buscar entre grandes cadenas de texto, lo más común y utilizado son las expresiones regulares. Estas representan un lenguaje
p        para buscar cadenas.
         Todo lenguaje que tenga soporta para expresiones regulares permite buscar una determinada expresión. Estas son como pequeños
:
         programas que permiten identificar una sección de texto que cumpla con ciertas características. Lo que se hace es pasarle al motor
/        una cadena y una expresión.
/        Ten en cuenta que las expresiones regulares que explicaremos a continuación no abarcan todo el abanico de posibilidades, pero son
v        las necesarias para el examen.
a         Tabla para la creación de expresiones:
l        Cadena                             Descripción                                    Ejemplo
o        Asd                              Cuando no se especifican caracteres especiales     Cadena:        aassddasdddasd
                                          (aquellos que se explican debajo), se interpreta   Expresión:     asd
r
                                          como una cadena simple (diferencia                 Coincidencias: 6 11
c                                         mayúsculas de minúsculas).
r        d, s o w                      Estos meta-caracteres buscan:                      Cadena:        0123aaddd1df
e                                         d cualquier número (0 a 9)                        Expresión:     d
a                                         s saltos de línea                                 Coincidencias:0 1 2 3 9
t                                         w caracteres alfanuméricos (letras, números,
i                                         o _)
         [abc], [a-f] , [a-fA-F]          Dentro de los [] se especifica un juego y/o        Cadena:         JavaWorld
v
                                          rango de caracteres válidos. Aquellos              Expresión:     [0-9a-f]
o                                         comprendidos entre – son los rangos.               Coincidencias: 1 3 8
.                                         Ejemplo: supongamos que buscamos cualquier
b                                         dígito, podríamos decir [0123456789], o lo
l                                         que es lo mismo [0-9].
o        [^asd0-9]                        La expresión [^…] actua al contrario que […].      Cadena:         0123456789
                                          Esta se comporta buscando cualquier carácter       Expresión:     [^0-36-9]
g
                                          que no se encuentre dentro del rango               Coincidencias: 4 5
s
                                          especificado.
p        +, *, ?                          Comodines de cantidad. Permiten indicar una        Cadena:         01 a2a 223
o                                         cantidad de un grupo o carácter (un meta-          Expresión:     d+
t                                         carácter es interpretado como un carácter) a       Coincidencias: 0 4 7
.                                         buscar.
c                                         + indica al menos 1 o más
                                          * indica 0 o más
o
                                          ? indica 0 o 1 ocurrencia
m        ()                               Indica que se busca cualquier carácter dentro      Cadena:
                                          del grupo. Estos se utilizan para luego poder      gustavoalberola@JavaWorld.com
                                          reemplazarlo por otra expresión, pero esa          Expresión:     ([^@])+
                                          parte no se explica dado que el examen no lo       Coincidencias: 0 16
                                          requiere.
                                          Se utiliza generalmente en conjunto con [] y
                                          un comodín (*, +, ?)
JavaWorld - SCJP - Capitulo 6
JavaWorld - SCJP - Capitulo 6
JavaWorld - SCJP - Capitulo 6
JavaWorld - SCJP - Capitulo 6
JavaWorld - SCJP - Capitulo 6
JavaWorld - SCJP - Capitulo 6
JavaWorld - SCJP - Capitulo 6

More Related Content

What's hot

What's hot (20)

Capitulo 7
Capitulo 7Capitulo 7
Capitulo 7
 
Anaga
AnagaAnaga
Anaga
 
Diagranacion periodico
Diagranacion periodicoDiagranacion periodico
Diagranacion periodico
 
Trampas de luz 09 al 15 de nov de 2012
Trampas de luz 09 al 15 de nov de 2012Trampas de luz 09 al 15 de nov de 2012
Trampas de luz 09 al 15 de nov de 2012
 
Podemoscast
PodemoscastPodemoscast
Podemoscast
 
Programación Enero Febrero 2011
Programación Enero Febrero 2011Programación Enero Febrero 2011
Programación Enero Febrero 2011
 
Los reciclados y sus proyectos
Los reciclados y sus proyectosLos reciclados y sus proyectos
Los reciclados y sus proyectos
 
Comic
ComicComic
Comic
 
Monigote raro deforme
Monigote raro deformeMonigote raro deforme
Monigote raro deforme
 
Moodle 1.9 Configuración del curso
Moodle 1.9  Configuración del cursoMoodle 1.9  Configuración del curso
Moodle 1.9 Configuración del curso
 
Sistema heterogéneo
Sistema heterogéneo Sistema heterogéneo
Sistema heterogéneo
 
Malla vial Tunja
Malla vial TunjaMalla vial Tunja
Malla vial Tunja
 
Triptico
TripticoTriptico
Triptico
 
Presentación atletismo
Presentación atletismoPresentación atletismo
Presentación atletismo
 
Unidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamientoUnidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamiento
 
Plano esquemático de Bueu
Plano esquemático de BueuPlano esquemático de Bueu
Plano esquemático de Bueu
 
Diagrama mcti
Diagrama mctiDiagrama mcti
Diagrama mcti
 
Xen Summit Asia 2009 Xen Arm Talk
Xen Summit Asia 2009 Xen Arm TalkXen Summit Asia 2009 Xen Arm Talk
Xen Summit Asia 2009 Xen Arm Talk
 
Proporcion De Quejas
Proporcion De QuejasProporcion De Quejas
Proporcion De Quejas
 
Lopez
LopezLopez
Lopez
 

Similar to JavaWorld - SCJP - Capitulo 6

Cap1 javaworld
Cap1 javaworldCap1 javaworld
Cap1 javaworldevanlitos
 
Historietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcíaHistorietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcíaHoracio Germán García
 
RESULTADOS SIMCE LICEO FRANCÉS
RESULTADOS SIMCE LICEO FRANCÉSRESULTADOS SIMCE LICEO FRANCÉS
RESULTADOS SIMCE LICEO FRANCÉSramoncortes
 
Publicación1 monik publisherr
Publicación1 monik publisherrPublicación1 monik publisherr
Publicación1 monik publisherrmonicaro_47
 
Futuro - Presentación
Futuro - PresentaciónFuturo - Presentación
Futuro - PresentaciónIlusionlabs
 
Edificio Plaza D'Halmar Exxacon Inmobiliario
Edificio Plaza D'Halmar Exxacon InmobiliarioEdificio Plaza D'Halmar Exxacon Inmobiliario
Edificio Plaza D'Halmar Exxacon InmobiliarioExxacon Inmobiliario
 
Examen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisionExamen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisiondemonia28
 
Modelos de comunicacion
Modelos de comunicacionModelos de comunicacion
Modelos de comunicacionLeon Lander
 
Para Elisa De Bethoven
Para Elisa De BethovenPara Elisa De Bethoven
Para Elisa De Bethovenkevin lozano
 
Presentacion El Año en que Murió el Tomate
Presentacion El Año en que Murió el TomatePresentacion El Año en que Murió el Tomate
Presentacion El Año en que Murió el TomateGonzalo Martín
 
Acceso electrónico de los ciudadanos a las AAPP
Acceso electrónico de los ciudadanos a las AAPPAcceso electrónico de los ciudadanos a las AAPP
Acceso electrónico de los ciudadanos a las AAPPBorja Rius
 
Julio Fierro: algunos aspectos de la minería en Colombia
Julio Fierro: algunos aspectos de la minería en ColombiaJulio Fierro: algunos aspectos de la minería en Colombia
Julio Fierro: algunos aspectos de la minería en ColombiaTatiana Rodríguez Maldonado
 

Similar to JavaWorld - SCJP - Capitulo 6 (20)

Cap1 javaworld
Cap1 javaworldCap1 javaworld
Cap1 javaworld
 
Historietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcíaHistorietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcía
 
RESULTADOS SIMCE LICEO FRANCÉS
RESULTADOS SIMCE LICEO FRANCÉSRESULTADOS SIMCE LICEO FRANCÉS
RESULTADOS SIMCE LICEO FRANCÉS
 
Publicación1 monik publisherr
Publicación1 monik publisherrPublicación1 monik publisherr
Publicación1 monik publisherr
 
Marifé Soria_Patrimonio Arq.
Marifé Soria_Patrimonio Arq.Marifé Soria_Patrimonio Arq.
Marifé Soria_Patrimonio Arq.
 
Futuro - Presentación
Futuro - PresentaciónFuturo - Presentación
Futuro - Presentación
 
Simce2009a
Simce2009aSimce2009a
Simce2009a
 
Edificio Plaza D'Halmar Exxacon Inmobiliario
Edificio Plaza D'Halmar Exxacon InmobiliarioEdificio Plaza D'Halmar Exxacon Inmobiliario
Edificio Plaza D'Halmar Exxacon Inmobiliario
 
Examen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisionExamen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervision
 
Modelos de comunicacion
Modelos de comunicacionModelos de comunicacion
Modelos de comunicacion
 
Mapa Valle
Mapa ValleMapa Valle
Mapa Valle
 
Para Elisa De Bethoven
Para Elisa De BethovenPara Elisa De Bethoven
Para Elisa De Bethoven
 
Para Elisa
Para ElisaPara Elisa
Para Elisa
 
Paraelisa[1]
Paraelisa[1]Paraelisa[1]
Paraelisa[1]
 
Evaluación vs. calificación
Evaluación vs. calificaciónEvaluación vs. calificación
Evaluación vs. calificación
 
Presentacion El Año en que Murió el Tomate
Presentacion El Año en que Murió el TomatePresentacion El Año en que Murió el Tomate
Presentacion El Año en que Murió el Tomate
 
Acceso electrónico de los ciudadanos a las AAPP
Acceso electrónico de los ciudadanos a las AAPPAcceso electrónico de los ciudadanos a las AAPP
Acceso electrónico de los ciudadanos a las AAPP
 
Juan pablo montoya soto
Juan pablo montoya sotoJuan pablo montoya soto
Juan pablo montoya soto
 
Memoria Paula Rojas
Memoria Paula RojasMemoria Paula Rojas
Memoria Paula Rojas
 
Julio Fierro: algunos aspectos de la minería en Colombia
Julio Fierro: algunos aspectos de la minería en ColombiaJulio Fierro: algunos aspectos de la minería en Colombia
Julio Fierro: algunos aspectos de la minería en Colombia
 

Recently uploaded

International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 

Recently uploaded (15)

International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 

JavaWorld - SCJP - Capitulo 6

  • 1.
  • 2. Java World – Capítulo 6 2 h t t p : / / g u s t a v o a l Bienvenidos a una nueva edición de JavaWorld b Le damos la bienvenida nuevamente a nuestros amigos de Valor Creativo “¡Leo, bienvenido a la vida real nuevamente!”. e r En esta entrega nos estará hablando un poco sobre las expectativas en la industria de la informática. Muy útil para todos o aquellos que se encuentren a un paso o dentro del ámbito de emprendedores. l Volviendo a la certificación, empezaremos a adentrarnos en la API de Java especializada para la entrada y salida de datos. Si, a ahora podrás leer ese .txt con todos los teléfonos que sacaste el sábado y pasarlo a tu agenda desarrollada en Java. . b Aprenderemos a persistir nuestros objetos con el modelo de serialización que nos propone de manera nativa Java, una utilidad l en principio para no depender de una base de datos, pero la cual tendrá un valor agregado cuando trabajemos enviando o mensajes a través de internet con este mismo método ;) g Ya estamos en la cuenta regresiva en las ediciones de JavaWorld, quedan solamente 4 capítulos. Aprovechen a sacarse sus s dudas, ya sea enviando comentarios o por email (los datos pueden obtenerlos en los blogs). p o Aprovechamos la oportunidad para agradecer el apoyo recibido por la comunidad y la buena onda para seguir adelante con este t proyecto. . c Gracias a todos. o El staff de revista JavaWorld m
  • 3. 3 Java World – Capítulo 6 h La clase String t Como hemos mencionado en capítulos anteriores, la clase String no puede ser modificada. Entonces, ¿cómo es que podemos asociar t diferentes cadenas a una misma variable de tipo String?. p String es un objeto inmutable : / Inmutable… Que palabra. ¿Y qué quiere decir? Simple, exactamente que un objeto String no puede cambiar su valor, pero en ningún momento se menciona que una variable String / no pueda apuntar a otro objeto. v Vamos a ver unos ejemplos para entenderlo mejor: a l public class PruebasString_001 { static public void main(String[] args) { o String s1 = new String("Hola"); r String s2 = "JavaWorld"; c System.out.println(s1); r System.out.println(s2); e s1 = s1 + "-"; a s2 = s2.toUpperCase(); //Pasa a mayúsculas la cadena t System.out.println(s1); i System.out.println(s2); v System.out.println(s1.concat(s2)); //concatena dos cadenas. Equivale a s1 + s2 o . String s3 = s2; b } } l o g Hola s JavaWorld p Hola- JAVAWORLD o Hola-JAVAWORLD t . Ahora puede que se estén preguntando “¿pero no dijo que un String era inmutable?”. Si, así es, pero reitero, nadie dice que una c variable de tipo String no pueda referenciar a otro objeto. o Veamos de manera gráfica el mapeo en memoria: m
  • 4. Java World – Capítulo 6 4 h 0000 – 000A 000B – 001F 0020 – 002C 002D - 0041 0042 - 0051 t Hola JavaWorld Hola- JAVAWORLD Hola JAVAWORLD t p : s1 s2 System.out.println(s1.concat(s2)); / Hola JavaWorld / g u s1 = new String("Hola"); s1 s2 s3 s s2 = "JavaWorld"; Hola- JAVAWORLD JAVAWORLD t s1 = s1 + "-"; a s2 = s2.toUpperCase(); v o Cada carácter dentro de un String se encuentra en formato UFT-16. Las posiciones en memoria mostradas anteriormente son solo a para ejemplificar. El comportamiento del almacenamiento es dirigido por la JVM en conjunto con el Sistema Operativo. l Cuando se inicializan las variables, se les asignan los valores “Hola” y “JavaWorld”, aquí es cuando creamos nuestros dos primeros b objetos de tipo String. e Luego, a s1 le concatenamos “-“ y guardamos el resultado en la misma variable, lo que produce que se genere un nuevo objeto, y r actualizando la referencia para que apunte a este. o A s2 lo transformamos en mayúsculas. Nuevamente se genera otro objeto, y almacenamos la referencia en s2. l Y por último, generamos una salida en pantalla de s1 + s2. En este caso, también se genera un nuevo objeto, con la salvedad de que la referencia no la captura nadie. Una vez que se mostró por pantalla esta variable es candidata a ser liberada por el garbage a collector. . Como podrán haber notado, en ningún momento se modificó ningún objeto que estuviera en memoria, pero si cambiaron las b referencias de s1 y s2. l Por último, cuando creamos un nuevo objeto (s3), y le asignamos el valor de s2, no se crea un nuevo objeto, se asigna la misma o posición de memoria. g Cada vez que generen una nueva cadena, se genera un nuevo objeto String, siempre. La única excepción es s cuando asignamos el valor de una variable String a otra. En este caso, las dos apuntan a la misma posición p de memoria. o t . String y la memoria c Dado que una cadena es algo tan común, y para poder optimizar la memoria, la JVM reserva un área especial de la memoria o denominada “String constant pool” (banco de constantes String). Cuando el compilador encuentra un literal de tipo String, verifica m en el banco si existe otra cadena idéntica. Si se encuentra una, directamente se referencia a esta, sino, se crea un nuevo objeto String. La clase String contiene el modificador de no acceso final. Esto quiere decir que no es posible sobre escribir la clase. Creación de cadenas Existe una diferencia sutil entre crear un String mediante un literal y un objeto:
  • 5. 5 Java World – Capítulo 6 String s1 = "JavaWorld" h Se crea una variable de referencia (s1) y un objeto String, el cual es almacenado en el banco de constantes String y asociado a s1. t String s2 = new String("JavaWorld") t Se crea una variable de referencia (s2). Como utilizamos la palabra clave new, se crea un objeto String fuera del banco de constantes p String y s2 referenciará a este. Luego, el literal “JavaWorld” es insertado en el banco. : Métodos de la clase String / A continuación se nombran los métodos más utilizados de la clase String: / Tipo de Método Descripción v valor a de retorno l char charAt(int indice) Devuelve el carácter ubicado en el índice especificado. o String concat(String str) Agrega un String al final de otro (equivalente a utilizar el +). r boolean equalsIgnoreCase(String otroString) Indica si dos cadenas son iguales, sin tener en cuenta mayúsculas. c int length() Devuelve la cantidad de caracteres que contiene la cadena. r String replace(char caracterViejo, char Reemplaza cada caracterViejo con el caracterNuevo. e caracterNuevo) a String substring(int inicioIndice, int finIndice) Devuelve una nueva cadena con los caracteres comprendidos desde t inicioIndice hasta finIndice. i String toLowerCase() Convierte los caracteres en minúsculas. v String toString() Devuelve el valor de un String (dado que es un String, se devuelve a sí o mismo). . String toUpperCase() Convierte los caracteres en mayúsculas. String trim() Elimina los espacios en blanco al comienzo y final de la cadena. b Para más información pueden consultar la API de Java l “http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html” o g s Hay que destacar que el tipo String tiene un método length(), y los arrays tienen un parámetro length. p o t StringBuffer y StringBuilder . Cuando vamos a utilizar muchas cadenas podemos utilizar las clases java.lang.StringBuffer o java.lang.StringBuilder. A diferencia de c String, con la cual si generaramos varias cadenas, se irían almacenando en el banco de constantes String, estas nuevas clases no se o almacenan en este último, sino que aprovechan el mismo espacio de memoria. m StringBuffer vs. StringBuilder La clase StringBuffer fue incorporada a partir de la versión 5 de Java. Posee exactamente la misma API que StringBuilder, salvo que esta última no es thread-safe (multihilo con seguridad). En otras palabras, los métodos no se encuentran sincronizados. Java recomienda siempre que sea posible, utilizar StringBuilder, dado que es mucho más veloz que su hermana StringBuffer. Solo StringBuilder no es thread-safe. StringBuffer si es thread-safe. Ambas comparten la misma API. cuando necesitemos que sea thread-safe, utilizaremos StringBuffer.
  • 6. Java World – Capítulo 6 6 Utilizando StringBuffer y StringBuilder h t String s1 = "JavaWorld"; //Se añade un String al banco de constantes String s1 += ". Vamos por más"; //Se genera un nuevo String, y la referencia al anterior se pierde t p //Se crea un StringBuffer (no va al banco de constantes String) StrungBuffer s1 = new StringBuffer("JavaWorld"); : s1.append(". Vamos por más");//Se modifica el mismo objeto (no se crea un nuevo String) / Métodos importantes en las clases StringBuffer y StringBuilder / g Valor de retorno Método Sobrecarga Descripción Ejemplo StringBuffer s = new u StringBuffer/ append(String s) SI Concatena la cadena s a la StringBuilder cadena dentro del objeto StringBuffer("Quiero ser"); s s.append(" un SCJP!"); (no es necesario atrapar la //Quiero ser un SCJP! t referencia para que el a cambio se realice). v StringBuffer/ delete(int inicio, NO Elimina la subcadena dentro StringBuffer s = new StringBuffer("Quiero ser un o StringBuilder int fin) de la cadena del objeto SCJP!"); s.delete(10, 13); //Quiero a desde la posición inicio a la ser SCJP! l posición fin. StringBuffer/ insert(int indice, SI Inserta una nueva cadena (s) StringBuffer s = new b StringBuffer("Quiero SCJP"); StringBuilder String s) a partir de la posición s.insert(7, "ser un "); e indicada por índice dentro //Quiero ser un SCJP r de la cadena del objeto. o StringBuffer/ reverse() NO Invierte la cadena. StringBuffer s = new StringBuffer("PJCS"); l StringBuilder s.revert(); //SCJP a String toString() NO Devuelve un String con el StringBuffer s = new StringBuffer("SCJP"); . valor del objeto. String s1 = s.toString(); //SCJP b l Es posible que se encuentren en el examen con métodos encadenados, estos simplemente se resuelven de o derecha a izquierda, y el resultado de un método, es el objeto que utiliza el segundo. g s Un ejemplo de equivalencias: p StringBuffer s = new StringBuffer("Un SCJP"); o s.reverse().delete(4, 7).append("... un que?").insert(0, "Quiero ser un "); t System.out.println(s); //Quiero ser un PJCS... un que? . StringBuffer s2 = new StringBuffer("Un SCJP"); c s2.reverse(); o s2.delete(4, 7); s2.append("... un que?"); m s2.insert(0, "Quiero ser un "); System.out.println(s2); //Quiero ser un PJCS... un que? StringBuffer y StringBuilder, al igual que String, no requieren ningún import.
  • 7. 7 Java World – Capítulo 6 Navegación de archivos e I/O h t El package java.io contiene una cantidad interesante de clases, pero para el examen, solo necesitaremos conocer algunas de ellas. t Solo se cubren los temas referidos a la entrada/salida de caracteres y serialización. p Cuando se utilice cualquier clase del package java.io, es necesario utilizar al comienzo del código la : sentencia import, o hacer referencia al nombre completo de la clase: / / v //Con el import a import java.io.File; l //... Declaración de la clase y método main File file = new File("archivo.txt"); o r //Sin el import java.io.File file = new java.io.File("archivo.txt"); c r e Descripción de las clases java.io para el examen a Clase Descripción t File Según la API “es una representación abstracta de rutas de directorios y archivos”. Aunque parezca i extraño, esta clase no sirve para leer o escribir un archivo, sino que es utilizada a nivel de saber si existe un v archivo, crear o eliminar un archivo, crear un nuevo directorio. o FileReader Esta clase es utilizada para leer archivos de texto. El método read() permite un acceso a bajo nivel, . obteniendo un carácter, una determinada cantidad de estos, o todos los caracteres del archivo. Esta clase b generalmente es envuelta (wrapped) por otra clase, como un BufferedReader. l BufferedReader Esta clase se utiliza para wrappear las clases de bajo nivel, como FileReader para volverlas más eficientes. En vez de leer carácter por carácter, lee una cantidad de estos y lo almacena en un buffer, cuando o nosotros le pedimos el siguiente carácter, lo obtiene directamente del buffer y no de un archivo g (recuerden que en Sistemas Operativos, existe un mínimo de transferencia, a esta porción se la denomina s bloque, de manera que lo más óptimo sería transferir la información en un tamaño que sea un múltiplo de p dicho bloque). o También añade el método readLine() que permite leer una línea entera (hasta el próximo carácter de salto t de línea, o final de archivo, lo que se encuentre primero). . FileWriter Esta clase es utilizada para escribir archivos de texto. El método write() permite escribir caracteres o un String dentro de un archivo. Al igual que FileReader, esta clase es generalmente wrapped en otras clases c como BufferedWriter. o BufferedWriter Esta clase se utiliza para wrappear las clases de bajo nivel, como FileWriter para volverlas más eficientes. m Esta clase escribirá de a varios caracteres para reducir los tiempos de espera por almacenamiento en disco. También provee un método llamado newLine(), el cual genera el carácter de salto de línea correspondiente a la plataforma en donde se está corriendo la aplicación. PrintWriter Esta clase ha sido mejorada considerablemente a partir de la versión 5 de Java. Permite realizar acciones como format(), printf(), y append(). Console Esta clase ha sido incorporada a partir de la versión 6 de Java. Provee métodos para leer desde consola y escribir en ella.
  • 8. Java World – Capítulo 6 8 Api de las clases java.io para el examen h Clase Extends Constructores Métodos t File Object (File f, String s) createNewFile() : boolean t (String s) delete() : boolean (String s, String s) exists() : boolean p isDirectory() : boolean : isFile() : boolean / list() : String[] mkdir() : boolean / renameTo(File destino) : boolean g (File f) read() : int u FileReader Writer (String s) s t BufferedReader Reader (Reader r) read() : int readLine() : String a FileWriter Writer (File f) close() : void v (String s) flush() : void o write(char[] cbuf) : void write(String cbuf) : void a BufferedWriter Reader (Writer wr) close() : void l flush() : void write(char[] cbuf) : void b write(String cbuf) : void e newLine() : void PrintWriter Writer (File f) //Desde Java 5 close() : void r (String s)//Desde Java 5 flush() : void o (OutputStream ou) format() (Writer wr) printf() l print() a println() . write() Console b l o Dentro del package java.io encontramos dos grandes grupos de clases, aquellas que contienen las palabras g InputStream o OutputStream, y aquellas otras que contienen Read o Write. s Las primeras son utilizadas a nivel de bytes, las últimas a nivel de caracteres. p o Creación de archivos a través de la clase File t Estos objetos son utilizados para representar archivos (pero no su contenido) o directorios. . c import java.io.File; //También es válido escribir: import java.io.* o public class PruebasFiles_001 { m static public void main(String[] args) { File file = new File("archivo_001.txt"); } } Vamos a empezar con un poco de código: Invito al lector si tiene una computadora con la JDK (no JRE) a mano a compilar y ejecutar este código (llamen a la clase PruebasFiles_001.java). Si realizaste la tarea anterior, puede que hayas ido corriendo al directorio a buscar tu nuevo archivo recién creado… pero… ¿dónde está?, no lo encuentro por ninguna parte. El código anterior no crea ningún archivo, sino que crea un objeto el cual tiene establecido un path (ruta), o nombre de archivo.
  • 9. 9 Java World – Capítulo 6 Pero, con dicha ruta, podemos llegar a crear un archivo. Veamos: h t t import java.io.File; //También es válido escribir: import java.io.* import java.io.IOException; //Si utilizaste import.java.io.*, no es necesaria esta p línea : public class PruebasFiles_001 { / static public void main(String[] args) { / try { File file = new File("archivo_001.txt"); v a boolean esArchivoNuevo = false; l //El método exists() devuelve un boolean indicando si existe o no el archivo o System.out.println("Existe el archivo: " + file.exists()); r esArchivoNuevo = file.createNewFile(); System.out.println("Es nuevo el archivo: " + esArchivoNuevo); c System.out.println("Existe el archivo: " + file.exists()); r } catch(IOException ex) { System.out.println("Ocurrio un error: " + ex); e } a } t } i Cuando ejecutemos el programa por primera vez recibiremos lo siguiente: v Existe el archivo: false o Es nuevo el archivo: true . Existe el archivo: true b En la segunda ejecución recibiremos una respuesta diferente: l Existe el archivo: true o Es nuevo el archivo: false g Existe el archivo: true s En la primer ejecución, cuando verificamos si existe el archivo, devuelve false, luego lo creamos, y al verificar nuevamente por su p existencia, indica que sí existe. o En la segunda ejecución, cuando verificamos si existe el archivo, nos encontramos con un true (lo creamos pero nunca lo t destruimos). Cuando intentamos volver a crearlo, devuelve un false, esto es porque el método createNewFile() intenta crear el archivo, si pudo crearlo devuelve true, sino devuelve false, en este caso, como ya existía, no sobreescribe, sino que no produce . ninguna acción. Y al verificar nuevamente por el archivo, sigue estando (que sorpresa, no?!). c o m
  • 10. Java World – Capítulo 6 10 Utilizando FileWriter y FileReader h En la práctica, es muy poco común utilizar estas clases sin wrappers, pero de todas maneras, veamos un ejemplo. t t import java.io.IOException; import java.io.FileReader; p import java.io.FileWriter; : import java.io.File; / public class PruebasFiles_002 { / static public void main(String[] args) { g char[] bufferLectura = new char[50]; int tamanio = 0; u s try { File file = new File("archivo.txt"); t FileWriter fw = new FileWriter(file); a fw.write("Quiero ser un SCJP"); v fw.flush(); o fw.close(); a FileReader fr = new FileReader(file); l tamanio = fr.read(bufferLectura); b System.out.println("Tamaño del archivo: " + tamanio + " bytes."); for(char c : bufferLectura) { e System.out.print(c); r } fr.close(); o } catch(IOException ex) { l System.out.println("Ocurrio un error: " + ex); a } } . } b l o g Tamaño del archivo: 18 bytes. s Quiero ser un SCJP p o Si abrimos el archivo, nos encontraremos con esta misma línea “Quiero ser un SCJP”. t . Combinando clases de entrada/salida c Todo el package de java.io fue diseñado para utilizarse en combinación entre clases. Combinando las clases se lo suele llamar: o wrapping, o decorando. m Para aquellos que se encuentren familiarizados con los patrones de diseño, les será más fácil entender que todo el modelo de clases de java.io se basa en el patrón Decorador. Para aquellos que no tengan ni idea de que estoy hablando, les dejo el link al blog de un profesor de la cátedra de Metodologías de Sistemas, en donde explica dicho patrón. http://metodologiasdesistemas.blogspot.com/search/label/decorador No es necesario que conozcas el patrón (no a fines de rendir la certificación SCJP), pero para quien le interese, nunca está de más.
  • 11. 11 Java World – Capítulo 6 El decorado de un objeto siempre se realiza de los más elementales, a los más abstractos. Veamos un ejemplo: h t import java.io.File; import java.io.FileWriter; t import java.io.BufferedWriter; p import java.io.IOException; : public class PruebasFiles_003 { / static public void main(String[] args) { / File file = new File("PruebasFiles_003.txt"); try { v FileWriter fw = new FileWriter(file); a BufferedWriter bf = new BufferedWriter(fw); l bf.write("Soy una clase decoradora!"); o bf.newLine(); bf.write("Estoy en otra la"); r c bf.flush(); r bf.close(); } catch(IOException ex){ e System.out.println("Ocurrio un error:" + ex); a } } t } i v En este caso, el BufferedWriter decora al FileWriter, y este a su vez decora a File. o . En este caso, al crear el FileWriter se crea el archivo, pero no el directorio. Si el archivo esta contenido b dentro de un directorio que no existe se generará una excepción IOException. l o Trabajando con archivos y directorios g s Básicamente, trabajar con archivos es casi lo mismo que con directorios, dado que para Java, un directorio no es más que un objeto de tipo File que referencia a un Directorio. p o import java.io.File; import java.io.IOException; t . public class PruebasFiles_004 { static public void main(String[] args) { c File dir = new File("carpeta"); o dir.mkdir(); //Genera el directorio carpeta m //Crea un archivo que se encuentra en el directorio carpeta File file = new File(dir, "archivo.txt"); try { file.createNewFile(); //Crea el archivo archivo.txt } catch(IOException ex){} } }
  • 12. Java World – Capítulo 6 12 También podemos listar todo el contenido de un directorio: h import java.io.File; t import java.io.IOException; t public class PruebasFiles_005 {//throws IOException { p static public void main(String[] args) { : File file = new File("."); String[] s = file.list(); / / for (String str : s) { System.out.println(str); g } u } s } t a Java.io.Console v A partir de Java 6 encontramos dentro del package java.io la clase Console. Esta sirve para obtener la instancia de la consola en que o se ejecuta la aplicación, siempre que esta sea una aplicación de consola. a En caso de que no lo sea, al intentar invocar un objeto de este tipo, recibiremos un valor null. l Los métodos de Console: b  flush() : void e  format(String fmt, Object... args) : Console r  printf(String format, Object... args) : Console o  reader() : Reader l  readLine() : String a  readLine(String fmt, Object... args) : String  readPassword() : char[] .  readPassword(String fmt, Object... args) : char[] b  writer() : PrintWriter l o import java.io.Console; g import java.util.Arrays; s public class PruebasFiles_006 { p static public void main(String[] args) { Console console = System.console(); o if (console != null) { t char[] pass; char[] realpass = {'e', 'n', 't', 'r', 'a', 'd', 'a'}; . c pass = console.readPassword("%s", "password: "); console.format("%s", "your password: "); o for(char c : pass) { console.format("%c", c); m } console.format("%s", "n"); if (Arrays.equals(pass, realpass)) { console.format("%s", "Bienvenido..."); } else { console.format("%s", "Lo lamento... Pero no vas a entrar!"); } } else { //if (console != null) { System.out.println("No se pudo obtener la instancia de la consola."); } } }
  • 13. 13 Java World – Capítulo 6 h El método format será explicado más adelante. t t Serialización de objetos p La serialización de un objeto es el almacenamiento del estado de este. Recordemos que cuando nos referimos a estado, hablamos : de los atributos de un objeto. / Por defecto, todos los atributos de un objeto serán serializados, a menos que estos se marquen con el modificador de no acceso transient. / v a La serialización de un objeto almacena el estado del objeto, pero no de la clase, es decir, si hay atributos static, estos no serán serializados. l o r ObjectOutputStrem y ObjectInputStream c Estas clases poseen dos métodos con los que tendremos que trabajar: r e  ObjectOutputStream.writeObject(); a  ObjectInputStream.readObject(); t i import java.io.File; import java.io.ObjectOutputStream; v import java.io.ObjectInputStream; o import java.io.FileOutputStream; . import java.io.FileInputStream; import java.io.IOException; b import java.io.Serializable; l //import java.lang.ClassNotFoundException; //No es necesario el import o public class PruebasSerialize_1 { g static public void main(String[] args) { File file = new File("PruebasSerialize_Pruebas.obj"); s //Creamos el objeto p Pruebas prueba = new Pruebas(45, 30); o //Lo serializamos t try { . FileOutputStream fs = new FileOutputStream(file); ObjectOutputStream ou = new ObjectOutputStream(fs); c ou.writeObject(prueba); o ou.close(); } catch(IOException ex) { m System.out.println("Ocurrio un error: " + ex); } //Establecemos el objeto a null para comprobar que realmente lo estamos leyendo. prueba = null;
  • 14. Java World – Capítulo 6 14 //Lo deserializamos h try { t FileInputStream fi = new FileInputStream(file); ObjectInputStream oi = new ObjectInputStream(fi); t prueba = (Pruebas) oi.readObject(); p oi.close(); } catch(IOException ex) { : System.out.println("Ocurrio un error: " + ex); / } catch(ClassNotFoundException ex) { / System.out.println("No es posible encontrar la clase: " + ex); } g //Mostramos el objeto por pantalla para verificar que se obtuvieron los datos u System.out.println(prueba); } s } t //Es necesario implementar la interface Serializable class Pruebas implements Serializable { a int width; v int height; o public Pruebas (int width, int height) { a this.width = width; l this.height = height; } b e public String toString() { return "width:" + width + "-height:" + height; r } o } l a Serializable es una interfaz constructora. No tiene métodos para implementar. . b l o Gráfico de objetos g Supongamos que tenemos la siguiente estructura de objetos: s p o Aerolinea Avion Piloto t . Dependencia c Y quisiéramos serializar nuestro objeto Aerolinea, podríamos pensar que hay que serializar el piloto, luego el avión, y luego la o aerolínea. Imaginen si el árbol de clases se duplica. m De manera que Java ideó una solución, si serializamos un objeto que contenga dependencias a otro objeto, la serialización se produce en cadena. Pero hay un pequeño inconveniente. Como vimos anteriormente, para poder serializar un objeto, este debe de implementar Serializable, si se genera una serialización en cadena, todas las clases afectadas deben de implementar serializable. Ejemplo completo: http://thechroniclesofbinary.googlecode.com/files/PruebasSerialize_2.java Compilar: javac –g PruebasSerialize_2.java
  • 15. 15 Java World – Capítulo 6 writeObject y readObject h t Java posee un mecanismo que permite generar una serie de métodos privados, los cuales, si existen, serán invocados durante la t serialización y deserialización. p Más patrones. Lo que estamos viendo en este caso es un ejemplo del patrón template. : http://metodologiasdesistemas.blogspot.com/search/label/decorador / Nuevamente, no es necesario conocer este patrón (no a fines de rendir la certificación SCJP) / La firma de los métodos son: v  private void writeObject(ObjectOutputStream os) a  private void readObject(ObjectInputStream is) l o Veamos un ejemplo de una situación donde esto sería útil: r Supongamos que poseemos las siguientes 2 clases, pero “ClaseIncognita” es una clase cuyo fuente no tenemos (esto es muy probable cuando utilices librerías de terceros). c r //Clase incógnita. Solo conocemos la firma de su constructor y método e ClaseIncognita(int valor); //Firma constructor int getValor(); //Firma método a t //Y tenemos nuestra clase que utiliza ClaseIncognita class ClaseConocida implements Serializable { i private ClaseIncognita claseIncognita; v private int otroValor; o public ClaseConocida(int otroValor, ClaseIncognita clase) { . this.otroValor = otroValor; b claseIncognita = clase; } l o public int getOtroValor() { return otroValor; g } s public int getValor() { p int valor = -1; o if (claseIncognita != null) //Código defensivo t valor = claseIncognita.getValor(); return valor; . } c } o m Los desarrolladores de la librería indicaron que ClaseIncognita no es serializable, pero si nosotros quisiéramos serializar ClaseConocida estaríamos en problemas. Como vimos, la serialización se genera en cadena, de manera que cuando llegue a ClaseIncognita, y se encuentre con que no implementa serializable, tendremos un hermoso NotSerializableException. Veamos como solucionamos esto:
  • 16. Java World – Capítulo 6 16 h //AGREGAMOS A LA CLASE ClaseConocida LOS SIGUIENTES MÉTODOS t //Implementamos los métodos readObject y writeObject t //throws IOException private void readObject(ObjectInputStream is) { p try { : is.defaultReaderObject(); / claseIncognita = new ClaseIncognita(is.readInt()); } catch(IOException ex) { / System.out.println("Error al intentar serializar el objeto: " + ex); g } catch(ClassNotFoundException ex) { System.out.println("La clase solicitada no fue localizada: " + ex); u } s } t //throws IOException, ClassNotFoundException a private void writeObject(ObjectOutputStream os) { v try { os.defaultWriteObject(); o os.writeInt(claseIncognita.getValor()); a } catch(IOException ex) { System.out.println("Error al intentar serializar el objeto: " + ex); l } b } e r Cuando se llama a la serialización, se invoca el método writeObject, el cual hace lo siguiente: o 1. invoca el método defaultWriteObject. Esto le indica a la clase que se serialice normalmente. l 2. Agrena un valor de tipo int luego de la serialización del objeto. a . Cuando se llama a la deserialización, se invoca el método readObject, el cual hace lo siguiente: b 1. Invoca el método defaultReadObject. Esto le indica a la clase que se deserialice normalmente. l 2. Lee un carácter de tipo int luego de la deserialización. o Esto es posible gracias a que los streams al leer los datos llevan un puntero. Cuando nosotros serializamos estamos diciendo por g ejemplo: los 48 caracteres que acabo de escribir son del objeto serializado. Luego le decimos, agregate un int (4 bytes). s Cuando hay que deserializarlo le decimos a la clase que lo haga de forma automática (esto quiere decir que va a leer los primeros 48 p caracteres para regenerar la clase). Luego, sabemos que colocamos un int luego de estos, así que lo leemos. o Es muy importante respetar el orden de almacenamiento, junto con los tipos de datos (recuerda que según el tipo es el tamaño del t mismo, y los streams trabajan en bytes). . Pero este código aun no funciona… ¿Perdón? c No pusimos el atributo claseIncognita con el modificador de no acceso transient. Ejemplo completo: http://thechroniclesofbinary.googlecode.com/files/PruebasSerialize_3.java o Compilar: javac –g PruebasSerialize_3.java m Si la clase padre implementa la interfaz Serializable, la clase hija implícitamente será también serializable, por más que esta no la implemente. Si recordamos las propiedades de herencia y polimorfismo es fácil darnos cuenta de ello. Si recuerdan, en capítulos anteriores hemos hablado de la manera en que se invocaba un método, y las llamadas que este producía. En el caso de Serializable, es totalmente diferente: Cuando un objeto es creado a raíz de una deserialización, no se invoca a ningún constructor (ni clase ni superclases), ni se le dan valores por defecto a todos sus atributos. Si la clase hija implementa Serializable, pero no la clase padre, solo se serializan los atributos de la clase hija, y el padre inicia con los valores por defecto de cada tipo primitivo.
  • 17. 17 Java World – Capítulo 6 Fechas, números y monedas h t La API de Java provee un set bastante extenso de clases para realizar tareas con fechas, números y monedas, pero para el examen t solo es necesario conocer las más comunes de estas. Estos conceptos lo que harán será adentrarnos un poco en el mundo de la internacionalización, o más bien conocido como i18n (una p manera de abreviar palabras es escribiendo la primer letra y la última, y en medio, la cantidad de caracteres que hay entre medio, de : manera que JavaWorld se escribiría j7d). / Para este fin debemos de conocer algunas clases de los package java.util y java.text: / package Clase Desc. v java.util Date La mayoría de los métodos de esta clase han quedado en desuso, pero es posible utilizarla como a puente entre Calendar y DateFormat. Una instancia de Date representa una fecha y hora determinada, l expresada en milisegundos (formato de fecha UNIX). java.util Calendar Esta clase provee una gran variedad de métodos que permiten la manipulación y conversión de fechas o y horas. r java.text DateFormat Esta clase no solo permite dar un formato a la fecha como Enero 2, 2009, sino que también permite c formatear según la configuración regional. r java.text NumberFormat Esta clase es utilizada para formatear la moneda por configuraciones regionales. e java.util Locale Esta clase se utiliza en conjunto con DatoFormat y NumberFormat para formatear fechas, números y a monedas para una región específica. t La clase Date i La clase Date se encuentra en desuso debido a que durante su diseño, no se tuvo en cuenta la i18n. v De todas maneras, la clase Date se encuentra en el examen por las siguientes razones: o  Es muy factible encontrarla en código antiguo. .  Es sencillo si lo que se busca es una manera rápida y simple de obtener fechas. b  Cuando se requiere solo una fecha universal. l  Es utilizada como puente entre las clases Calendar y DateFormat. o g Esta clase contiene un long que representa los milisegundos desde el 01/01/1970 (también conocido como formato UNIX o POSIX). Método/Constructor Descripción Ejemplo s Date() Constructor que crea un objeto Date con la fecha actual. Date date = new Date(); p Date date = new Date(1000000L); Date(long fecha) Constructor que crea un objeto Date con la fecha o especificada. t getTime() Obtiene la fecha del objeto Date. Date date = new Date(); long l = date.getDate(); . c setTime(long fecha) Establece la nueva fecha para el objeto Date. Date date = new Date(); date.setDate(1234L); o m La salida estándar de Date es “*Mes+ *Día+ *Hora+:*Minutos+:*Segundos+ MDT *Año+”. Ejemplo: Jan 08 21:12:45 MDT 2009. La clase Calendar Calendar es una clase abstracta, de manera que no puedes crear una instancia de Calendar con un new. Calendar se encuentra diseñada con el patrón Singleton. Para lo que deseen saber acerca del mismo pueden consultar http://es.wikipedia.org/wiki/Singleton. La finalidad de este es que solo exista una única instancia de esta clase. Calendar posee un enum para indicar si se trata de meses, días, semanas, años, y otros. Pueden ver la lista completa en la doc. de la API de Java en: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html
  • 18. Java World – Capítulo 6 18 Método/Constructor Descripción Ejemplo h Calendar.getInstance() Constructor que devuelve una Calendar calendario = Calendar.getInstance(); t instancia de Calendar con fecha t 01/01/1970. Calendar.getInstance(Locale region) Constructor que devuelve una Locale region = new Locale("es"); p Calendar calendario = instancia de Calendar con fecha Calendar.getInstance(region); : 01/01/1970 con una / configuración regional específica. / setTime(Date fecha) Establece la fecha obteniendo la calendario.setDate(fecha); g misma de un objeto Date. calendario.getDate(); u getDate() Obtiene la fecha recibiendo un objeto de tipo Date. s getFirstDayOfWeek() Obtiene según la configuración calendario.getFirstDayOfWeek(); t regional, cual es el primer día de a la semana. v add(int part, int cant) Añade la cantidad especificada a calendario.add(Calendar.MONTH, 5); o la parte indicada. Part se a especifica mediante un l enumerador y puede representar un día, mes, año, o cualquier otro. b roll(int part, int cant) Actua similar a add, salvo que las calendario.roll(Calendar.MONTH, 5); e partes mayores no se modifican. r Ejemplo:si modificamos los días, o por más que agrguemos 100, el l més y año seguirán siendo los a mismos. . b l o g s p o t . c o m
  • 19. 19 Java World – Capítulo 6 La clase DateFormat h t Al igual que Calendar, DateFormat es una clase abstracta, de manera que solo puedes obtener una instancia de la misma a través de t métodos de clase. Constructor p DateFormat.getInstance() : DateFormat.getDateInstance() / DateFormat.getDateInstance(int format) / DateFormat.getDateTimeInstance() v DateFormat.getDateTimeInstance(int format) a Un ejemplo de formateo: l import java.util.Date; o import java.text.DateFormat; r //Configuración regional Calendario Griego – GMT -03:00 c r public class PruebasFormat_002 { e static public void main(String[] args) { Date fecha = new Date(); a DateFormat[] formats = new DateFormat[6]; t formats[0] = DateFormat.getInstance(); formats[1] = DateFormat.getDateInstance(); i formats[2] = DateFormat.getDateInstance(DateFormat.SHORT); v formats[3] = DateFormat.getDateInstance(DateFormat.MEDIUM); formats[4] = DateFormat.getDateInstance(DateFormat.LONG); o formats[5] = DateFormat.getDateInstance(DateFormat.FULL); . b for(DateFormat df : formats) { System.out.println(df.format(fecha)); l } o } } g s 28/12/09 17:53 p 28/12/2009 o 28/12/09 28/12/2009 t 28 de diciembre de 2009 . lunes 28 de diciembre de 2009 c o La clase Locale m La API dice que la clase Locale es “una ubicación geográfica, políticam o región cultural”. Para el examen, solo necesitamos saber los siguientes constructores:  Locale(String idioma)  Locale(String idioma, String ciudad) Y los métodos:  getDisplayCountry()  getDisplayCountry(Locale ubicacion)  getDisplayLanguage()  getDisplayLanguage(Locale ubicacion) El idioma representa un código establecido en la norma ISO 639.
  • 20. Java World – Capítulo 6 20 Tanto DateFormat como NumberFormat pueden recibir como parámetro un objeto Locale en momento de h la instanciación. Pero una vez instanciado este, no hay ningún método para cambiar la configuración t geográfica. t p : La clase NumberFormat / NumberFormat también es una clase abstracta, así que no intentes ningún new con esta. / Método/Constructor Descripción g NumberFormat.getInstance() Obtiene una instancia con la configuración regional por defecto. u NumberFormat.getInstance(int region) Obtiene una instancia con la configuración regional especificada. NumberFormat.getCurrencyInstance() Obtiene la instancia de la moneda para la configuración regional s por defecto. t NumberFormat.getCurrencyInstance(int región) Obtiene la instancia de la moneda para la configuración regional a especificada. v getMaximunFractionDigits() Obtiene la cantidad máxima de decimales en la fracción. o setMaximunFractionDigits(int digitos) Establece la cantidad máxima de decimales en la fracción. a parse() : throws ParseException Parsea un String. l setParseIntegerOnly(boolean soloInteger) Establece si se obtiene solo la parte entera, o también la parte decimal. b e Tablas de resumen r Tabla en la que se resumen todas las instanciaciones o creaciones: o Clase Costructor o método de creación l java.util.Date new Date(); new Date(long milisegundosDesde01011970); a java.util.Calendar Calendar.getInstance(); Calendar.getInstance(Locale region); . java.util.Locale Locale.getDefault(); b new Locale(String idioma); new Locale(String idioma, String ciudad); l java.text.DateFormat DateFormat.getInstance(); DateFormat.getDateInstance(int estilo); o DateFormat.getDateInstance(int estilo, Locale region); java.text.NumberFormat NumberFormat.getInstance(); g NumberFormat.getInstance(Locale region); NumberFormat.getNumberInstance(); s NumberFormat.getNumberInstance(Locale region); p NumberFormat.getCurrencyInstance(); NumberFormat.getCurrencyInstance(Locale region); o Tabla en la que se resuelven los usos más comunes para las clases anteriores: t Caso Pasos Date fecha = new Date(); . Obtener la fecha y hora actuales. String fechaStr = fecha.toString(); c Obtener un objeto que permita realizar cálculos Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, 3); o de fecha y hora en la configuración regional por cal.roll(Calendar.YEAR, 1); m defecto. Obtener un objeto que permita realizar cálculos Locale region = new Locale("en", "US"); Calendar cal = Calendar.getInstance(region); de fecha y hora en cualquier configuración cal.add(Calendar.MONTH, 3); regional. cal.roll(Calendar.YEAR, 1); Obtener un objeto que permita realizar cálculos Calendar cal = Calendar.getInstance(); Date fecha = cal.getDate(); de fecha y hora, y luego formatear la salida para Locale region = new Locale("en", "US"); diferentes regiones con diferentes formatos de DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, region); String fechaStr = df.format(fecha); salida. Obtener un objeto que permita formatear Locale region = new Locale("en", "US"); float valor = 123.4567f; números o monedas entre varias regiones. NumberFormat nf1 = NumberFormat.getInstance(region); NumberFormat nf2 = NumberFormat.getCurrencyInstance(region); String valor1 = nf1.format(valor1);
  • 21. 21 Java World – Capítulo 6 String valor2 = nf2.format(valor2); h Búsqueda y parseo dentro de Strings t t Para buscar entre grandes cadenas de texto, lo más común y utilizado son las expresiones regulares. Estas representan un lenguaje p para buscar cadenas. Todo lenguaje que tenga soporta para expresiones regulares permite buscar una determinada expresión. Estas son como pequeños : programas que permiten identificar una sección de texto que cumpla con ciertas características. Lo que se hace es pasarle al motor / una cadena y una expresión. / Ten en cuenta que las expresiones regulares que explicaremos a continuación no abarcan todo el abanico de posibilidades, pero son v las necesarias para el examen. a Tabla para la creación de expresiones: l Cadena Descripción Ejemplo o Asd Cuando no se especifican caracteres especiales Cadena: aassddasdddasd (aquellos que se explican debajo), se interpreta Expresión: asd r como una cadena simple (diferencia Coincidencias: 6 11 c mayúsculas de minúsculas). r d, s o w Estos meta-caracteres buscan: Cadena: 0123aaddd1df e d cualquier número (0 a 9) Expresión: d a s saltos de línea Coincidencias:0 1 2 3 9 t w caracteres alfanuméricos (letras, números, i o _) [abc], [a-f] , [a-fA-F] Dentro de los [] se especifica un juego y/o Cadena: JavaWorld v rango de caracteres válidos. Aquellos Expresión: [0-9a-f] o comprendidos entre – son los rangos. Coincidencias: 1 3 8 . Ejemplo: supongamos que buscamos cualquier b dígito, podríamos decir [0123456789], o lo l que es lo mismo [0-9]. o [^asd0-9] La expresión [^…] actua al contrario que […]. Cadena: 0123456789 Esta se comporta buscando cualquier carácter Expresión: [^0-36-9] g que no se encuentre dentro del rango Coincidencias: 4 5 s especificado. p +, *, ? Comodines de cantidad. Permiten indicar una Cadena: 01 a2a 223 o cantidad de un grupo o carácter (un meta- Expresión: d+ t carácter es interpretado como un carácter) a Coincidencias: 0 4 7 . buscar. c + indica al menos 1 o más * indica 0 o más o ? indica 0 o 1 ocurrencia m () Indica que se busca cualquier carácter dentro Cadena: del grupo. Estos se utilizan para luego poder gustavoalberola@JavaWorld.com reemplazarlo por otra expresión, pero esa Expresión: ([^@])+ parte no se explica dado que el examen no lo Coincidencias: 0 16 requiere. Se utiliza generalmente en conjunto con [] y un comodín (*, +, ?)