scjp, clase 10: strings, i/o
DESCRIPTION
Slides de la décima clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.Contenido:1. String2. StringBuilder/Buffer3. ArchivosTRANSCRIPT
![Page 1: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/1.jpg)
SCJP 6 Clase 10 – Strings, I/O
Ezequiel Aranda
Sun Microsystems Campus Ambassador
![Page 2: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/2.jpg)
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 in the 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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/3.jpg)
AGENDA
> Strings
> StringBuilder y StringBuffer
> Manejo del sistema de archivos
![Page 4: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/4.jpg)
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 sucede cuando modificamos un String?
![Page 5: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/5.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/6.jpg)
Modificando un String
s = s.concat(" more stuff");
> “concat” añade un literal al final del String…
> … Pero, ¿No habíamos dicho que los Strings eran inmutables?
![Page 7: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/7.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/8.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/9.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/10.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/11.jpg)
> 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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/12.jpg)
Métodos importantes de la clase String
Método Tipo de retorno Descripción
charAt(int index) char Retorna el carácter ubicado en la posición index
concat(String s) String Retorna el String que resulta de concatenar el
String utilizado para invocar el método y s.
equalsIgnoreCase(String s)
boolean Retorna true si el contenido de ambos strings es
igual, ignorando mayusculas/ minusculas
length() int La longitud del String usado para invocar el
método
replace(char old, char new)
String Retorna un String resultado de reemplazar el
carácter “old” por el carácter “new”
![Page 13: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/13.jpg)
Métodos importantes de la clase String (II)
Método Tipo de retorno Descripción
substring(int a) substring (int a,
int b) String
Retorna una subcadena que va desde la posición ‘a’ hasta la posición ‘b’
toLowerCase() String Retorna un String cuyo valor es el del utilizado
para invocar el método, pero con todas las mayúsculas intercambiadas por minúsculas .
toString() String El valor del String.
toUpperCase() String Funciona igual que toLowerCase, pero
intercambiando minúsculas por mayúsculas.
trim() 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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/14.jpg)
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 de Strings 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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/15.jpg)
¿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 razones de rendimiento, usar la clase que no es thread safe salvo que nos encontremos en un entorno multi hilo.
![Page 16: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/16.jpg)
Usando StringBuffer/Builder
> Utilizando Strings: String x = "abc"; x = x.concat("def");
> Utilizando StringBuffer/Builder StringBuffer x= new StringBuffer("abc"); x.append("def");
> En ambos casos, si imprimimos el valor de x, el mismo será “abcdef”, pero en el caso del String, hemos abandonado en el pool al String “abc” original.
![Page 17: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/17.jpg)
Métodos importantes de StringBuffer/Builder
Método Tipo de retorno Descripción
append (String s) StringBuffer/Builder Retorna el StringB que resulta de concatenar el
StringB utilizado para invocar el método y el String s.
delete(int a, int b) StringBuffer/Builder Retorna un StringB que resulta de eliminar del invocante la subcadena delimitada por ‘a’ (0
based) y ‘b’ (1 based).
insert(int a, String b)
StringBuffer/Builder Retorna un StringB que resulta de insertar en el
invocante la subcadena ‘b’ a partir de la posición ‘a’.
reverse() StringBuffer/Builder Retorna un StringB que resulta de invertir el
invocante.
toString() 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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/18.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/19.jpg)
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 de BufferedReader para escrituras. Provee escritura por líneas.
> PrintWriter: Un writer con varios métodos que lo vuelven muy flexible y versátil.
![Page 20: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/20.jpg)
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 File System.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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/21.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/22.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/23.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/24.jpg)
Parte de java.io necesaria para el examen SCJP
Clase Extiende
de Argumentos clave de los
constructores Métodos clave
File Object File, String
String Strin, String
createNewFile() delete() exists()
isDirectory() isFile() list()
mkdir() renameTo()
FileWriter Writer File
String
close() flush() write()
BufferedWriter Writer Writer
close() flush()
newLine() write()
![Page 25: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/25.jpg)
Parte de java.io necesaria para el examen SCJP (II)
Clase Extiende
de Argumentos clave de
los constructores Métodos clave
PrintWriter Writer
File (java 5) String (java 5) OutputStream
Writer
close() flush()
format()*, prinI()* print(), println()
write()
FileReader Reader File
String read()
BufferedReader Reader Reader read()
readLine()
![Page 26: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/26.jpg)
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 a dicho 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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/27.jpg)
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 se crean sin un mkdir().
![Page 28: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/28.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/29.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/30.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/31.jpg)
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: SCJP, Clase 10: Strings, I/O](https://reader033.vdocuments.net/reader033/viewer/2022060202/559b8a371a28ab62158b46fb/html5/thumbnails/32.jpg)
Preguntas