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
                                                                                                   ¡                                                                               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  
:
/                                                                
            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                                        
.                                                                                                                                                           na  
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
                                                                                                                                                                      meros              b
objetos  de  tipo  String.                                                                                                                                                               e
                                        -­‐                                                                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
                                                                                                                                                                                         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                                                                                                             co.  
:           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                                                                                       
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  
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[]  c buf)  :  void  
                                                                                                         write(String  cbuf)  :   void                                             a
BufferedWriter                    Reader             (Writer  wr)                                        close()  :  void                                                          l
                                                                                                         flush()  :  void  
                                                                                                         write(char[]  c buf)  :  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).  
                                                                                                                                                                  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
                                                                                                                                                                                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
         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  c lase  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).  
                                                                                                                                                                                            .
                                                                
                                                                                                                                                                                            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.  
                             

  
Capitulo 6
Capitulo 6
Capitulo 6
Capitulo 6
Capitulo 6
Capitulo 6
Capitulo 6
Capitulo 6
Capitulo 6
Capitulo 6
Capitulo 6
Capitulo 6

More Related Content

What's hot

Diagranacion periodico
Diagranacion periodicoDiagranacion periodico
Diagranacion periodico
JUan Feria
 
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
Macarena Casuso
 
Programación Enero Febrero 2011
Programación Enero Febrero 2011Programación Enero Febrero 2011
Programación Enero Febrero 2011
Zaragoza Activa
 
Diagrama mcti
Diagrama mctiDiagrama mcti
Diagrama mcti
grenyjoel
 
Processos de Improbidade Administrativa do Aloisio Vieira
Processos de Improbidade Administrativa do Aloisio VieiraProcessos de Improbidade Administrativa do Aloisio Vieira
Processos de Improbidade Administrativa do Aloisio Vieira
Luciano Viana
 
Plano esquemático de Bueu
Plano esquemático de BueuPlano esquemático de Bueu
Plano esquemático de Bueu
Concello de Bueu
 

What's hot (20)

JavaWorld - SCJP - Capitulo 1
JavaWorld - SCJP - Capitulo 1JavaWorld - SCJP - Capitulo 1
JavaWorld - SCJP - Capitulo 1
 
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
 
Anaga
AnagaAnaga
Anaga
 
Programación Enero Febrero 2011
Programación Enero Febrero 2011Programación Enero Febrero 2011
Programación Enero Febrero 2011
 
Monigote raro deforme
Monigote raro deformeMonigote raro deforme
Monigote raro deforme
 
Comic
ComicComic
Comic
 
Los reciclados y sus proyectos
Los reciclados y sus proyectosLos reciclados y sus proyectos
Los reciclados y sus proyectos
 
Sistema heterogéneo
Sistema heterogéneo Sistema heterogéneo
Sistema heterogéneo
 
Diagrama mcti
Diagrama mctiDiagrama mcti
Diagrama mcti
 
Malla vial Tunja
Malla vial TunjaMalla vial Tunja
Malla vial Tunja
 
Processos de Improbidade Administrativa do Aloisio Vieira
Processos de Improbidade Administrativa do Aloisio VieiraProcessos de Improbidade Administrativa do Aloisio Vieira
Processos de Improbidade Administrativa do Aloisio Vieira
 
Plano esquemático de Bueu
Plano esquemático de BueuPlano esquemático de Bueu
Plano esquemático de Bueu
 
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
 
Presentación atletismo
Presentación atletismoPresentación atletismo
Presentación atletismo
 
Lopez
LopezLopez
Lopez
 
Proporcion De Quejas
Proporcion De QuejasProporcion De Quejas
Proporcion De Quejas
 
Diario de Avisos, martes 11 de diciem
Diario de Avisos, martes 11 de diciemDiario de Avisos, martes 11 de diciem
Diario de Avisos, martes 11 de diciem
 
Entrega finaaaaal
Entrega finaaaaalEntrega finaaaaal
Entrega finaaaaal
 
Presentación Objetivos enfermería de hospitalización
Presentación Objetivos enfermería de hospitalización Presentación Objetivos enfermería de hospitalización
Presentación Objetivos enfermería de hospitalización
 

Viewers also liked

PEOU Bustaldea Junio 2011
PEOU Bustaldea Junio 2011PEOU Bustaldea Junio 2011
PEOU Bustaldea Junio 2011
SaraPrisma2012
 
Salida intergeneracional
Salida intergeneracionalSalida intergeneracional
Salida intergeneracional
carmenillueca
 
MÉTODOS DE BÚSQUEDA
MÉTODOS DE BÚSQUEDAMÉTODOS DE BÚSQUEDA
MÉTODOS DE BÚSQUEDA
gestion1
 
Marzo10 vera munoz_raul
Marzo10 vera munoz_raulMarzo10 vera munoz_raul
Marzo10 vera munoz_raul
rauldocencia
 
lecturas; el arte de la guerra y el príncipe
lecturas; el arte de la guerra y el príncipelecturas; el arte de la guerra y el príncipe
lecturas; el arte de la guerra y el príncipe
William Guevara Roman
 

Viewers also liked (20)

PEOU Bustaldea Junio 2011
PEOU Bustaldea Junio 2011PEOU Bustaldea Junio 2011
PEOU Bustaldea Junio 2011
 
18 jose
18 jose18 jose
18 jose
 
Magnetismo
MagnetismoMagnetismo
Magnetismo
 
El coaching en méxico
El coaching en méxicoEl coaching en méxico
El coaching en méxico
 
Buscadores
BuscadoresBuscadores
Buscadores
 
Circulo de viena
Circulo de vienaCirculo de viena
Circulo de viena
 
Guia 04 parte 11
Guia 04 parte 11Guia 04 parte 11
Guia 04 parte 11
 
Salida intergeneracional
Salida intergeneracionalSalida intergeneracional
Salida intergeneracional
 
Guia clase 2 terminada
Guia clase 2 terminadaGuia clase 2 terminada
Guia clase 2 terminada
 
Nuestros servicios realiza sep2013
Nuestros servicios realiza sep2013Nuestros servicios realiza sep2013
Nuestros servicios realiza sep2013
 
Magnetismo
MagnetismoMagnetismo
Magnetismo
 
MÉTODOS DE BÚSQUEDA
MÉTODOS DE BÚSQUEDAMÉTODOS DE BÚSQUEDA
MÉTODOS DE BÚSQUEDA
 
Multimedia interactiva
Multimedia interactivaMultimedia interactiva
Multimedia interactiva
 
Guion clase4 terminada
Guion clase4  terminadaGuion clase4  terminada
Guion clase4 terminada
 
Presentación1 curso
Presentación1 cursoPresentación1 curso
Presentación1 curso
 
Curso de power point
Curso de power point Curso de power point
Curso de power point
 
Marzo10 vera munoz_raul
Marzo10 vera munoz_raulMarzo10 vera munoz_raul
Marzo10 vera munoz_raul
 
La materia
La materiaLa materia
La materia
 
Salida intergeneracional
Salida intergeneracionalSalida intergeneracional
Salida intergeneracional
 
lecturas; el arte de la guerra y el príncipe
lecturas; el arte de la guerra y el príncipelecturas; el arte de la guerra y el príncipe
lecturas; el arte de la guerra y el príncipe
 

Similar to Capitulo 6

Similar to Capitulo 6 (18)

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
 
Podemoscast
PodemoscastPodemoscast
Podemoscast
 
Examen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisionExamen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervision
 
Marifé Soria_Patrimonio Arq.
Marifé Soria_Patrimonio Arq.Marifé Soria_Patrimonio Arq.
Marifé Soria_Patrimonio Arq.
 
Yo me anticipo!!
Yo me anticipo!!Yo me anticipo!!
Yo me anticipo!!
 
Unidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamientoUnidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamiento
 
Mapa Valle
Mapa ValleMapa Valle
Mapa Valle
 
Linea desarrollo institucional
Linea  desarrollo institucionalLinea  desarrollo institucional
Linea desarrollo institucional
 
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
 
Folleto del museo_del_romanticismo
Folleto del museo_del_romanticismoFolleto del museo_del_romanticismo
Folleto del museo_del_romanticismo
 
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]
 
Triptico
TripticoTriptico
Triptico
 
Ebook diadospais
Ebook diadospaisEbook diadospais
Ebook diadospais
 
National instruments presentation human capital group dirk willems
National instruments presentation human capital group   dirk willemsNational instruments presentation human capital group   dirk willems
National instruments presentation human capital group dirk willems
 
Panel 2 Ana Polanco
Panel 2 Ana PolancoPanel 2 Ana Polanco
Panel 2 Ana Polanco
 

More from jorg_marq

Clase9 threads
Clase9 threadsClase9 threads
Clase9 threads
jorg_marq
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclasses
jorg_marq
 
Clase7 generics
Clase7 genericsClase7 generics
Clase7 generics
jorg_marq
 
Clase6 collections
Clase6 collectionsClase6 collections
Clase6 collections
jorg_marq
 
Clase5 controldeflujo
Clase5 controldeflujoClase5 controldeflujo
Clase5 controldeflujo
jorg_marq
 
Clase4 operadores
Clase4 operadoresClase4 operadores
Clase4 operadores
jorg_marq
 
Clase3 asignaciones
Clase3 asignacionesClase3 asignaciones
Clase3 asignaciones
jorg_marq
 
Clase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpooClase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpoo
jorg_marq
 
Clase1 introduccinalcurso
Clase1 introduccinalcursoClase1 introduccinalcurso
Clase1 introduccinalcurso
jorg_marq
 
Capitulos 8 9-10
Capitulos 8 9-10Capitulos 8 9-10
Capitulos 8 9-10
jorg_marq
 
Clase10 stringsio
Clase10 stringsioClase10 stringsio
Clase10 stringsio
jorg_marq
 
Whither cman
Whither cmanWhither cman
Whither cman
jorg_marq
 
Ex300 objectives
Ex300   objectivesEx300   objectives
Ex300 objectives
jorg_marq
 
Ex200 objectives
Ex200   objectivesEx200   objectives
Ex200 objectives
jorg_marq
 

More from jorg_marq (16)

Clase9 threads
Clase9 threadsClase9 threads
Clase9 threads
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclasses
 
Clase7 generics
Clase7 genericsClase7 generics
Clase7 generics
 
Clase6 collections
Clase6 collectionsClase6 collections
Clase6 collections
 
Clase5 controldeflujo
Clase5 controldeflujoClase5 controldeflujo
Clase5 controldeflujo
 
Clase4 operadores
Clase4 operadoresClase4 operadores
Clase4 operadores
 
Clase3 asignaciones
Clase3 asignacionesClase3 asignaciones
Clase3 asignaciones
 
Clase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpooClase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpoo
 
Clase1 introduccinalcurso
Clase1 introduccinalcursoClase1 introduccinalcurso
Clase1 introduccinalcurso
 
Capitulos 8 9-10
Capitulos 8 9-10Capitulos 8 9-10
Capitulos 8 9-10
 
Capitulo 5
Capitulo 5Capitulo 5
Capitulo 5
 
Capitulo 4
Capitulo 4Capitulo 4
Capitulo 4
 
Clase10 stringsio
Clase10 stringsioClase10 stringsio
Clase10 stringsio
 
Whither cman
Whither cmanWhither cman
Whither cman
 
Ex300 objectives
Ex300   objectivesEx300   objectives
Ex300 objectives
 
Ex200 objectives
Ex200   objectivesEx200   objectives
Ex200 objectives
 

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 ¡   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   : /   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     . na   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 meros   b objetos  de  tipo  String.     e -­‐  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 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 co.   : 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     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   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[]  c buf)  :  void   write(String  cbuf)  :  void   a BufferedWriter   Reader   (Writer  wr)   close()  :  void   l   flush()  :  void   write(char[]  c buf)  :  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).   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   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 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  c lase  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).   .   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.