31
SCJP 6 Clase 10 – Strings, I/O Ezequiel Aranda Sun Microsystems Campus Ambassador

Java SCJP Clase 10

Embed Size (px)

Citation preview

Page 1: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 1/32

SCJP 6Clase 10 – Strings, I/O

Ezequiel Aranda

Sun Microsystems Campus

Ambassador

Page 2: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 2/32

Disclaimer & Acknowledgments

Even though Ezequiel Aranda is a full-time employee of Sun

Microsystems, the contents here are created as his own

personal endeavor and thus does not reflect any official

stance of Sun Microsystems.

Sun Microsystems is not responsible for any inaccuracies inthe contents.

This slides are Licensed under a Creative Commons

Attribution – Noncommercial – Share Alike 3.0

> http://creativecommons.org/licenses/by-nc-sa/3.0/

Page 3: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 3/32

 AGENDA

> Strings

StringBuilder y

StringBuffer

Manejo del sistema

de archivos

Page 4: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 4/32

String

> El concepto clave del String es entender que,

una vez creado un objeto de este tipo, no

puede ser modificado.

Entonces, ¿qué es lo que realmente sucedecuando modificamos un String?

Page 5: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 5/32

Creando un String

String s = "abcdef";

Crea un nuevo objeto de la clase String con el

valor “abcdef”, y se lo asigna a la referencia

‘s’.

String s2 = s;

Asigna el mismo string a la referencia s2.

Page 6: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 6/32

Modificando un String

s = s.concat(" more stuff");

“concat” añade un literal al final del String…

… Pero, ¿No habíamosdicho que los Strings

eran inmutables?

Page 7: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 7/32

Modificando un String (II)

En realidad, el objeto String es inmutable,pero la referencia no lo es.

> Por lo tanto, lo que sucede es lo siguiente:

La JVM crea un nuevo String y le da el valor que

resulta de concatenar “abcdef ” y “ more stuff ”.

Luego, actualiza ‘s’ para referenciar al nuevo

String.

Observaciones> 

Técnicamente, ahora hay 3 Strings: “abcdef ,” “ 

more stuff ” y “abcdef more stuff ”.

‘s2’ aún hace referencia a “abcdef ”.

Page 8: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 8/32

Pregunta

String s1 = "spring ";

String s2 = s1 + "summer ";

s1.concat("fall ");

s2.concat(s1);

s1 += "winter ";

System.out.println(s1 + " " + s2);

¿Qué imprime?

¿Cuántos objetos se crearon?

Page 9: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 9/32

Strings y Memoria

Para que el manejo de memoria sea más eficiente,

la JVM reserva una porción de memoria conocida

como “String Pool”.

La regla es la siguiente:cuando el compilador

encuentra un literal, se

fija en el pool a ver si

hay alguno que

coincida, si es así la

referencia es dirigida al

literal existente, y no se

crea un nuevo literal.

Page 10: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 10/32

Strings y Memoria (II)

> Esto es lo que hace a la inmutabilidad una

buena idea.

> Si una de varias referencias al mismo String

pudiese modificarlo, sería desastroso.

Pero… ¿Qué pasa si alguien sobrescribe la

funcionalidad de la clase String? ¿Podría

causar problemas en el pool?

Page 11: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 11/32

> Nada, porque la clase String es final.

Pero… ¿Qué pasa si alguien

 sobrescribe la funcionalidad

de la clase String? ¿Podría

causar problemas en el

pool?

Page 12: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 12/32

Métodos importantes de la clase

StringMétodo Tipo de retorno Descripción

!"#$%&'()& ()+,-.  !"#$  Retorna el carácter ubicado en la posición index

!/)!#&'0&$()1 2.  StringRetorna el String que resulta de concatenar el

String utilizado para invocar el método y s.

,34#5261)/$,7#2,'

0&$()1 2. boolean

Retorna true si el contenido de ambos strings es

igual, ignorando mayusculas/ minusculas

5,)1&"'.  intLa longitud del String usado para invocar el

método

$,85#!,'!"#$ /5+9

!"#$ ),:. String

Retorna un String resultado de reemplazar el

carácter “old” por el carácter “new”

Page 13: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 13/32

Métodos importantes de la clase

String (II)Método Tipo de retorno Descripción

24;2&$()1'()& #.

substring (int a,

int b)

StringRetorna una subcadena que va desde la

posición ‘a’ hasta la posición ‘b’

&/</:,$7#2,'.  String Retorna un String cuyo valor es el del utilizadopara invocar el método, pero con todas las

mayúsculas intercambiadas por minúsculas .

&/0&$()1'.  String El valor del String.

&/=88,$7#2,'.  String

Funciona igual que toLowerCase, pero

intercambiando minúsculas por mayúsculas.

&$(>'.  String

Retorna un String cuyo valor es el del utilizado

para invocar el método pero sin espacios al

principio o al final de la cadena.

Page 14: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 14/32

StringBuffer y StringBuilder

> Deben utilizarse cuando debemos hacer

muchas modificaciones en un String.

Si modificamos muchas veces una gran cantidad

de Strings terminaremos con un pool gigante deStrings abandonados.

> Un uso común de StringBuffer es la

manipulación de archivos:

Tratamos al archivo como un gran bloque de

datos, los cerramos y luego podemos reutilizar el

buffer para el siguiente archivo.

Page 15: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 15/32

¿StringBuffer o StringBuilder?

> Son exactamente iguales, con la excepción de

que StringBuffer es thread safe mientras que

StringBuilder no lo es.

Como siempre, es recomendable, por razonesde rendimiento, usar la clase que no es

thread safe salvo que nos encontremos en un

entorno multi hilo.

Page 16: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 16/32

Usando StringBuffer/Builder

> Utilizando Strings:String x = "abc";

x = x.concat("def");

Utilizando StringBuffer/BuilderStringBuffer x= new StringBuffer("abc");

x.append("def");

> En ambos casos, si imprimimos el valor de x,

el mismo será “abcdef”, pero en el caso delString, hemos abandonado en el pool al

String “abc” original.

Page 17: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 17/32

Métodos importantes de

StringBuffer/BuilderMétodo Tipo de retorno Descripción

#88,)+ '0&$()1 2.  StringBuffer/Builder

Retorna el StringB que resulta de concatenar el

StringB utilizado para invocar el método y el

String s.

+,5,&,'()& #9 ()& ;.  StringBuffer/Builder

Retorna un StringB que resulta de eliminar del

invocante la subcadena delimitada por ‘a’ (0based) y ‘b’ (1 based).

()2,$&'()& #9 0&$()1

;. StringBuffer/Builder

Retorna un StringB que resulta de insertar en el

invocante la subcadena ‘b’ a partir de la

posición ‘a’.

$,?,$2,'.  StringBuffer/BuilderRetorna un StringB que resulta de invertir el

invocante.

&/0&$()1'.  String Retorna el valor del StringB invocante

Nota: si bien estos métodos “retornan” un StringB, en realidad

modifican el invocante y retornan una referencia al mismo.

Page 18: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 18/32

Clases para el manejo de archivos

> File: representación abstracta de un

pathname. Se usa para realizar operaciones

como crear, buscar y borrar archivos y

directorios.> 

FileReader: utilizada para leer archivos de

caracteres. En general se utilizan wrappers

más específicos.

BufferedReader: un wrapper de FileReader

que utiliza buffers para aumentar la

eficiencia.

Page 19: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 19/32

Clases para el manejo de archivos (II)

> FileWriter: la contraparte de FileReader, al

igual que con esta última, en general se

utilizan wrappers más versátiles y eficientes.

BufferedWriter: la contraparte deBufferedReader para escrituras. Provee

escritura por líneas.

PrintWriter: Un writer con varios métodos que

lo vuelven muy flexible y versátil.

Page 20: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 20/32

Creando un archivo utilizando File

class Writer1 { public static void main(String [] args) {

try {

 boolean newFile = false;

File file = new File ("fileWrite1.txt"); //un

objeto FileSystem.out.println(file.exists()); // ¿existe el

archivo?

newFile = file.createNewFile(); // lo creamos

System.out.println(newFile);

System.out.println(file.exists()); // ¿ahora si?

}

catch(IOException e) { }

}

}

Page 21: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 21/32

Creando un archivo utilizando File (II)

> Primera ejecución:

exists retorna false.

createNewFile retorna true.

El segundo exists retorna true.

Segunda ejecución:

exists retorna true.

createNewFile retorna false.> 

El segundo exists retorna true.

Page 22: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 22/32

Usando FileWriter y FileReader

class Writer2 {

 public static void main(String [] args) {

char[] in = new char[50];

// para almacenar el input

int size = 0;

try {

File file = new File("fileWrite2.txt”);

// creamos un objeto file

FileWriter fw = new FileWriter(file);

// y un objeto FileWriter

fw.write("howdy\nfolks\n");

// escribimos algunos caracteres

fw.flush(); // flush

fw.close(); // close

Page 23: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 23/32

Usando FileWriter y FileReader (II)

FileReader fr = new FileReader(file);

// creamos un objeto FileReader

size = fr.read(in);

// Leemos el archivo completo

System.out.print(size + " ");

// cantidad de bytes que leimos

for(char c : in)

// imprimimos el array

System.out.print(c);

fr.close(); // cerramos el archivo

}

catch(IOException e) { }

}

}

Page 24: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 24/32

Parte de java.io necesaria para el examen SCJP

ClaseExtiende

de

Argumentos clave de los

constructoresMétodos clave

File Object

File, String

String

Strin, String

!$,#&,@,:A(5,'.

+,5,&,'.

,-(2&2'.

(2B($,!&/$C'.

(2A(5,'.

5(2&'.

>D+($'.$,)#>,E/'.

FileWriter WriterFile

String

close()

flush()

write()

BufferedWriter Writer Writer

close()flush()

newLine()

write()

Page 25: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 25/32

Parte de java.io necesaria para el examen SCJP (II)

ClaseExtiende

de

Argumentos clave de

los constructoresMétodos clave

PrintWriter Writer

File (java 5)

String (java 5)

OutputStream

Writer

!5/2,'.

F42"'.

G/$>#&'.H9 8$()I'.H

8$()&'.9 8$()&5)'.

:$(&,'. 

FileReader ReaderFile

Stringread()

BufferedReader Reader Readerread()

readLine()

Page 26: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 26/32

Trabajando con archivos y directorios

File file = new File("foo"); 

Si “foo” no existe, no se crea hasta que lo

ordenemos con createNewFile().

Si “foo” existe, el objeto file ahora se refiere adicho archivo.

> Si, en cambio, queremos crear un archivo:> File file = new File("foo");

file.createNewFile(); > File file = new File("foo");

PrintWriter pw = new PrintWriter(file);

Page 27: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 27/32

Trabajando con archivos y directorios (II)

El caso de los directorios es similar:File myDir = new File("mydir");

 myDir.mkdir();

File myFile = new File(myDir, "myFile.txt");

 myFile.createNewFile(); 

> Si bien creando un writer podemos crear un

archivo sin necesidad de llamar a

createNewFile(), los directorios nunca secrean sin un mkdir().

Page 28: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 28/32

Trabajando con archivos y directorios (III)

// creamos un directorio

File delDir = new File("deldir");

delDir.mkdir();

// agregamos un archivo al directorio 

File delFile1 = new File(delDir, "delFile1.txt");

delFile1.createNewFile();

// agregamos otro archivo al directorio

File delFile2 = new File(delDir, "delFile2.txt");

delFile2.createNewFile();

// borramos delFile1

delFile1.delete();

Page 29: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 29/32

Trabajando con archivos y directorios (IV)

// intentamos borrar el directorio

System.out.println(“delDir is” + delDir.delete());

// creamos un nuevo objeto

File newName = new File(delDir, "newName.txt");

// renombramos el archivo

delFile2.renameTo(newName);

// de la misma forma, renombramos el directorio 

File newDir = new File("newDir");

delDir.renameTo(newDir);

Page 30: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 30/32

Trabajando con archivos y directorios (V)

De lo anterior, podemos observar que:

delete() no borra un directorio si no está vacío.

renameTo() debe recibir un objeto File valido del

cual tomará el nombre.> 

renameTo( ) puede renombrar un directorio si no

está vacío.

Page 31: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 31/32

Buscar archivos

Asumiendo que tenemos un directorio

llamado “searchThis”, podemos iterar a

través del mismo en busca de un archivo con:

String[] files = new String[100];File search = new File("searchThis");

files = search.list();

for(String fn : files)

System.out.println("found " + fn);

Page 32: Java SCJP Clase 10

8/18/2019 Java SCJP Clase 10

http://slidepdf.com/reader/full/java-scjp-clase-10 32/32

Preguntas