SCJP, Clase 10: Strings, I/O
-
Upload
flekoso -
Category
Technology
-
view
4.095 -
download
0
description
Transcript of SCJP, Clase 10: Strings, I/O
SCJP 6 Clase 10 – Strings, I/O
Ezequiel Aranda
Sun Microsystems Campus Ambassador
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/
AGENDA
> Strings
> StringBuilder y StringBuffer
> Manejo del sistema de archivos
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?
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.
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?
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”.
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?
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.
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?
> 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?
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”
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.
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.
¿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.
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.
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.
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.
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.
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) { } } }
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.
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
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) { } } }
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()
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()
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);
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().
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();
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);
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.
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);
Preguntas