Posts Tagged ‘ Java ’

Backreference en expresiones regulares (y II)

Esta segunda parte viene a explicar cómo realizar reemplazos en expresiones regulares mediante backreference, es decir, a partir de las coincidencias de esa expresión regular.

Como ya se explicó en otro post, para realizar reemplazos en java con expresiones regulares se utiliza la función appendReplacement(StringBuffer sb, String replacement) de la clase Matcher. Si dentro de la cadena de reemplazo se establece algún $n, éste será automáticamente sustituido por el valor del grupo correspondiente.

Sigue leyendo

Reflexión en Java

La reflexión es la capacidad que tiene un programa para conocer su estructura de alto nivel. Se puede saber a partir de una clase ya compilada todos sus métodos, propiedades, instanciarla, ejecutar sus métodos,…

Cuando el código fuente de un programa se compila, pierde la información sobre la estructura del programa conforme se genera el código de bajo nivel. La reflexión nos permite, en tiempo de ejecución, volver a conocer la estructura de alto nivel.

En Java, el API Relection es quien nos proporciona todo lo que necesitamos.

Mediante el método estático  forName(String) de la clase Class se puede crear el molde de una clase a través de su nombre.


Class myClass = Class.forName("className");

Y mediante el método getInstance() se crea un objeto de esa clase. A partir de este momento ya se puede acceder a las propiedades y métodos de esa clase.


myClass.getInstance();

Y ya, con sólo esto, la potencia y las posibilidades se disparan.

Sigue leyendo

XML

XML, siglas en inglés de eXtensive Markup Language, es un metalenguaje extensible de etiquetas desarrollado por el Worl Wide Web Consortium (W3C).

Los documentos XML tienen muchísimas utilidades, pero en mi caso, los he utilizado y utilizo para dos muy concretas:

  • comunicación entre una aplicación clinte y un servidor. En est caso creamos una API basada en ficheros XML.
  • ficheros de confiuración de aplicaciones.

Ficheros XML en Java

Para trabajar con ficheros XML en Java existen dos API’s que son SAX y DOM.

Yo no he trabajado con SAX por una sóla razón, no permite modificar un fichero XML, cosa que DOM sí hace y que para mi es necesario. Además la progrmación es bastante más sencila en el caso de DOM. Como contrapartida, DOM consume más memoria porque carga todo el fichero en memoria y SAX no.

Con todos estos puntos sobre la mesa, yo me quedo con DOM. Esta API carga el contenido del docmento XML en un Document a partir del cuál se obtiene toda la información.

Sigue leyendo

Expresiones regulares en Java

Hay que tener en cuenta que usar expresiones regulares permite hacer búsquedas muy complejas, pero a cambio de un coste: la bajada de rendimiento en la velocidad de procesado. Una bajada no muy grande, pero que si se realiza muchas veces puede llegar a tener un coste muy alto, por lo que hay que evaluar en cada momento si es conveniente utilizar una expresión regular o recurrir a otras opciones como la función indexOf(String, int) de la clase String.

Para trabajar con expresiones regulares en Java se utiliza el paquete java.util.regex que está formado por dos clases, la clase Matcher y la clase Pattern, y una excepción PatternSyntaxException. La clase Pattern permite definir el patrón de búsqueda mediante el método compile(String).


Pattern p = Pattern.compile(“Java”);
// Define un patrón para buscar la palabra Java

Sigue leyendo

Precisión decimal en Java

Ésta, es una de esas cosas que cuando creas aplicaciones para ti, puedes ignorarlas o ni darte cuenta, pero cuando estás creando aplicaciones para grandes empresas pueden fastidiarte muy mucho.

En mi caso, el problema surgió cuando empecé a trabajar con dinero y en determinadas operaciones se perdían céntimos. ¿Cómo? Pues sí, aquí es donde empezó la búsqueda de un porqué para que


Double x = new Double(8192.55);
System.out.println("->" + (x * 100));

tenga como resultado por pantalla


819254.9999999999

Sigue leyendo

Obtener ruta del directorio de compilación

Estoy creando una librería para ser usada en proyectos J2EE. Esta librería arranca cargando una serie de configuraciones que obtiene de un fichero XML. Lo más sencillo para ubicar el fichero de configuración es en la raíz del directorio que contiene el código fuente (en mi caso sería dentro del directorio src) Es la misma filosofía que Struts2 con su fichero struts.xml. Al estar en el directorio src y desplegar la aplicación, se puede acceder a este fichero a través del directorio de compilación. Y es precisamente aquí cuando surge el problema, ¿cómo se en tiempo de ejecución el directorio donde se han desplegado todas las clases?

Lo primero que pensé, y que ya sabía, es que puedo conocer el directorio de una clase en concreto. Simplemente con


getClass().getResource("/");

El problema es que esta línea me devuelve la ruta completa desde la raíz hasta la clase, por lo que no tengo forma de saber cuál es el directorio raíz de compilación.

Después de mucho buscar y buscar por Internet, llegué a una respuesta en un pequeño foro perdido en algún servidor del mundo. Y la respuesta era “tan sencilla” como


Thread.currentThread().getContextClassLoader().getResource("/").getPath();

De esta forma se obtiene la ruta donde se despliegan todos los archivos .class de nuestra aplicación. Así de ¿simple?.

Ficheros en Java

Java, como no podía ser de otra forma, nos proporciona una serie de clases para el trabajo con ficheros. Estas clases se encuentran dentro del paquete java.io y la clase principal para el tratamiento de ficheros es la clase File.

Las clases que se utilizan para la gestión de ficheros son FileInputStream y FileReader para la lectura, y FileOutputStream y FileWriter para la escritura. Estas clases realizan un acceso al disco por cada operación de lectura y/o escritura que se realice sobre un fichero, lo cuál puede suponer un problema dependiendo de la cantidad de información que con la que se trabaje en esos ficheros. Si no queremos que el trabajo con ficheros se convierta en un proceso lento y costoso para el disco debemos recurrir a los Buffered Streams.

Sigue leyendo