Vous êtes sur la page 1sur 32

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 aade un literal al final del String


> Pero, No habamos
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
>Tcnicamente, ahora hay 3 Strings: abcdef,
more stuff y abcdef more stuff.
>s2 an 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?
>Cuntos objetos se crearon?

Strings y Memoria
>Para que el manejo de memoria sea ms eficiente,
la JVM reserva una porcin 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, sera desastroso.
>Pero Qu pasa si alguien sobrescribe la
funcionalidad de la clase String? Podra
causar problemas en el pool?

Pero Qu pasa si alguien


sobrescribe la funcionalidad
de la clase String? Podra
causar problemas en el
pool?

>Nada, porque la clase String es final.

Mtodos importantes de la clase


String
Mtodo

Tipo de retorno

Descripcin

charAt(intindex)

char

Retorna el carcter ubicado en la posicin index

concat(Strings)

String

Retorna el String que resulta de concatenar el


String utilizado para invocar el mtodo y s.

equalsIgnoreCase(
Strings)

boolean

Retorna true si el contenido de ambos strings es


igual, ignorando mayusculas/ minusculas

length()

int

La longitud del String usado para invocar el


mtodo

replace(charold,
charnew)

String

Retorna un String resultado de reemplazar el


carcter old por el carcter new

Mtodos importantes de la clase


String (II)
Mtodo

Tipo de retorno

Descripcin

substring(inta)
substring (int a,
int b)

String

Retorna una subcadena que va desde la


posicin a hasta la posicin b

toLowerCase()

String

Retorna un String cuyo valor es el del utilizado


para invocar el mtodo, pero con todas las
maysculas intercambiadas por minsculas .

toString()

String

El valor del String.

toUpperCase()

String

Funciona igual que toLowerCase, pero


intercambiando minsculas por maysculas.

String

Retorna un String cuyo valor es el del utilizado


para invocar el mtodo pero sin espacios al
principio o al final de la cadena.

trim()

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 comn de StringBuffer es la


manipulacin 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 excepcin 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.

Mtodos importantes de
StringBuffer/Builder
Mtodo

Tipo de retorno

Descripcin

StringBuffer/Builder

Retorna el StringB que resulta de concatenar el


StringB utilizado para invocar el mtodo y el
String s.

StringBuffer/Builder

Retorna un StringB que resulta de eliminar del


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

insert(inta,String
b)

StringBuffer/Builder

Retorna un StringB que resulta de insertar en el


invocante la subcadena b a partir de la
posicin a.

reverse()

StringBuffer/Builder

Retorna un StringB que resulta de invertir el


invocante.

toString()

String

Retorna el valor del StringB invocante

append(Strings)

delete(inta,intb)

Nota: si bien estos mtodos retornan un StringB, en realidad


modifican el invocante y retornan una referencia al mismo.

Clases para el manejo de archivos


>File: representacin 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
ms especficos.
>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 ms verstiles y eficientes.
>BufferedWriter: la contraparte de
BufferedReader para escrituras. Provee
escritura por lneas.
>PrintWriter: Un writer con varios mtodos que
lo vuelven muy flexible y verstil.

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 ejecucin:
>exists retorna false.
>createNewFile retorna true.
>El segundo exists retorna true.

>Segunda ejecucin:
>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

File

FileWriter

BufferedWriter

Extiende Argumentos clave de los


de
constructores

Mtodos clave

Object

File, String
String
Strin, String

createNewFile()
delete()
exists()
isDirectory()
isFile()
list()
mkdir()
renameTo()

Writer

File
String

close()
flush()
write()

Writer

close()
flush()
newLine()
write()

Writer

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


Extiende
de

Argumentos clave de
los constructores

Mtodos clave

PrintWriter

Writer

File (java 5)
String (java 5)
OutputStream
Writer

close()
ush()
format()*,prinI()*
print(),println()
write()

FileReader

Reader

File
String

read()

BufferedReader

Reader

Reader

read()
readLine()

Clase

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 vaco.
>renameTo() debe recibir un objeto File valido del
cual tomar el nombre.
>renameTo() puede renombrar un directorio si no
est vaco.

Buscar archivos
>Asumiendo que tenemos un directorio
llamado searchThis, podemos iterar a
travs 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

Vous aimerez peut-être aussi