Resumen String, StringBuffer, StringBuilder, File, Serializacion, Dates, Numbers, Currency, Parsing, Tokenizing y Formatting en Java

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.