Buenos días, vamos a ver un resumen sobre String, StringBuilder, StringBuffer, File I/O, Serialización, Dates, Numbers y Currency, Parsing, Tokenizing y Formatting.
-
String, StringBuffer y StringBuilder
- Los objetos String son inmutables y las variables de referencia de String no lo son.
- Si se crea un nuevo String sin asignarlo, se perderá en nuestro programa.
- Si redireccionamos una referencia de String a otro nuevo String, el antiguo String puede perderse.
- Los métodos String usan un índice basado en 0, excepto para el segundo argumento del método substring().
- La clase String es final, por tanto sus métodos no pueden ser sustituidos.
- Cuando la JVM encuentra un literal String, se añade al pool de String.
- Los String tienen un método: length(); los arrays tienen un atributo llamado length.
- La API de StringBuffer es la misma que la nueva API de StringBuilder, excepto que los métodos de StringBuilder no son sincronizados para la seguridad del hilo.
- Los métodos de StringBuilder deberían ejecutarse mas rápido que los métodos de StringBuffer.
- Los siguientes puntos son iguales tanto para StringBuilder como para StringBuffer:
- Son mutables (Pueden ser cambiados sin crear un nuevo objeto).
- Los métodos de StringBuffer actúan en el objeto invocado, y los objetos pueden cambiar sin una asignación explícita en la sentencia.
- El método equals() de StringBuffer no está sustituido; no compara valores.
- Hay que recordar que los métodos encadenados se evalúan de izquierda a derecha.
- Métodos de String que hay que recordar: charAt(), concat(), equalsIgnoreCase(), length(), replace(), substring(), toLowerCase(), toString(), toUpperCase(), y trim().
- Los métodos de StringBuffer que hay que recordar: append(), delete(), insert(), reverse(), toString().
-
File I/O
- Las clases que debemos entender del package java.io son File, FileReader, BufferedReader, FileWriter, BufferedWriter, PrintWriter y Console.
- Un nuevo objeto File no significa que haya un nuevo fichero en el disco duro.
- Los objetos File pueden representar ya sea un fichero o un directorio.
- La clase File nos permite administrar (añadir, renombrar y borrar) ficheros y directorios.
- Los métodos createNewFile() y mkdir() añade entradas a nuestro sistema de ficheros.
- FileWriter y FileReader son clases de I/O de bajo nivel. Podemos usarlas para escribir y leer archivos, pero deberían estar normalmente envueltas.
- Las clases en java.io están diseñadas para ser “encadenadas” o “envueltas”.
- Es muy común “envolver” un BufferedReader en torno a un FileReader o un BufferedWriter en torno a un FileWriter, para tener acceso a métodos de mas alto nivel.
- Los PrintWriter pueden ser usaros para envolver otros Writer.
- Los objetos Console pueden leer entradas que no son mostradas usando System.console().
-
Serializacion
- Las clases que tenemos que entender están en el paquete java.io; entre ellas se incluyen: OnjectOutputStream y ObjectInputStream primariamente, y FileOutputStream y FileInputStream porque las usaremos para crear flujos de bajo nivel que las clases ObjectXxxStream usarán.
- Una clase debe implementar Serializable antes de que el objeto pueda ser serializado.
- El método ObjectOutputStream.writeObject() serializa objetos, y el método ObjectInputStream.readObject() deserializa objetos.
- Si marcamos una variable de instancia como transient, no será serializado aunque el resto del estado del objeto si lo será.
- Se puede suplementar el proceso de serialización de una clase automáticamente implementando los métodos writeObject() y readObject(). Si hacemos esto, las llamadas integradas a defaultWriteObject() y defaultReadObject(), respectivamente, controlarán la parte de al serialización que ocurre con normalidad.
- Si una superclase implementa Serializable, entonces sus subclases lo harán automáticamente.
- Si una superclase no implementa Serializable, entonces cuando un objeto de la subclase sea deserializado, el constructor de la superclase será invocado, junto a sus superconstructores.
-
Dates, numbers y Currency
- Las clases que debemos entender son java.util.Date, java.util.Calendar, java.text.DateFormat, java.text.NumberFormat y java.util.Locale.
- La mayoría de los métodos de la clase Date están obsoletas.
- Un Date se guarda como long, el número de milisegundos desde el 1 de Enero de 1970.
- Los objetos Date está entre Calendar y Locale.
- La clase Calendar provee un potente set de métodos para manipular fechas, realizando tareas como obtener los días de la semana, o añadir un número de meses al año a una fecha.
- Las instancias de Calendar se crean usando métodos static (getInstance()).
- Los métodos de la clase calendar que deberíamos entender son add(), el cual nos permite añadir o sustraer varias piezas (minutos, dias, años) de fechas, y roll(), el cual funciona como add() pero no incrementa las piezas grandes de una fecha.
- Las instancias de DateFormat son creadas usando métodos de factoría static (getInstance() y getDateInstance()).
- Hay diferentes estilos de formato disponibels en la clase DateFormat.
- El método DateFormat.format() es usado para crear String que contienen las fechas formateadas apropiadamente.
- La clase Locale es usada en conjunción con DateFormat y NumberFormat.
- Tanto objetos DateFormat como NumberFormat pueden ser construidos con un específico e inmutable Locale.
-
Parsing, Tokenizing y Formatting
- Regex es la abreviación de expresiones regulares, las cuales son patrones usados para buscar en cierta información en fuentes grandes de información.
- Regex es un sub-lenguaje que existe en Java y en otros lenguajes.
- Regex permite crear patrones de busqueda usando literales de caracteres o metacaracteres. Los metacaracteres permites buscar información ligeramente mas abstracta como “digitos” o “espacios”.
- Metacaracteres como d, s, w y . son importantes.
- Regex provee cuantificadores que nos permites especificar conceptos como “Buscar por uno o mas dígitos por fila”.
- Cuantificadores codiciosos o “greedy” pueden ser ?, * y +.
- Recordemos que los metacaracteres y los String no se llevan muy bien a no ser que recordemos el “escape” apropiadamente. Por ejemplo String s = “\d”;.
- Las clases Pattern y Matcher tienen las capacidades mas potentes de regex en Java.
- Tenemos que entender el método de Pattern llamado compile() y los métodos de Matcher llamados matches(), pattern(), find(), start(), y group().
- Podemos usar la clase java.util.Scanner para hacer búsquedas simples de regex, pero es primariamente destinado a Tokenización.
- Tokenizing es el proceso de partir información delimitada en piezas mas pequeñas.
- En el tokenizing, la información que queremos es llamada tokens, y las cadenas que lo separan son llamados delimitadores.
- La tokenización puede ser realizada con la clase Scanner, o con el método String.split().
- Los delimitadores son caracteres singulares como comas, o expresiones regex mas complejas.
- La clase Scanner nos permite tokenizar información dentro de un bucle, el cual nos permite salir cuando queramos.
- La clase Scanner nos permite tokenizar String o flujos, o archivos.
- El método String.split() tokeniza la fuente d einformación entera de golpe, por lo que grandes cantidades de información puede llegar a ser un proceso mas lento.
- En Java 5 fueron añadidos dos métodos para formatear información en su salida. Estos métodos son format() y printf(). Estos métodos pueden encontrarse en la clase PrintStream.
- Los métodos format() y printf() tienen una funcionalidad idéntica.
- Formatear información con printf() puede lograrse usando cadenas formateadas que están asociadas con argumentos primitivos o cadenas.
- El método format()permite mezclar literales dentro de nuestras cadenas formateadas.
- Los valores para formatear cadenas que deberíamos conocer son:
- Flags: -, + 0, “,”, (
- Conversiones: b, c, d, f y s.
- Si nuestro caracter de conversión no coincide con el tipo de argumento, una excepción será lanzada.