SCJP, Clase 10: Strings, I/O

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

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. Archivos

Transcript of SCJP, Clase 10: Strings, I/O

Page 1: SCJP, Clase 10: Strings, I/O

SCJP 6 Clase 10 – Strings, I/O

Ezequiel Aranda

Sun Microsystems Campus Ambassador

Page 2: SCJP, Clase 10: Strings, I/O

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

AGENDA

> Strings

> StringBuilder y StringBuffer

> Manejo del sistema de archivos

Page 4: SCJP, Clase 10: Strings, I/O

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

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

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

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

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

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

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

> 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

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

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

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

¿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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Preguntas