Upload
raul-oramas-bustillos
View
226
Download
0
Embed Size (px)
Citation preview
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
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/
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
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?
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.
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?
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 ”.
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?
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.
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?
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?
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”
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.
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.
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.
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.
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.
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.
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.
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) { }
}
}
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.
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
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) { }
}
}
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()
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()
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);
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().
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();
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);
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.
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);
8/18/2019 Java SCJP Clase 10
http://slidepdf.com/reader/full/java-scjp-clase-10 32/32
Preguntas