Posts tagged Java
Algunas API’s Java que te pueden servir: commons-io
2commons-io trae un montón de clases que te pueden servir al momento de utilizar lecturas y escrituras de archivos, entre otras cosillas.
Por si no lo sabías una de las malas practicas mas recurrentes programando con java es, no cerrar los Stream y ciertos Readers adecuadamente, o te complicas mucho con los try/catch, vamos a ver un par de ejemplos clásicos:
Primero agregamos la dependencia de maven, ojo que las versiones 2.x están escritas para Java 1.5 y las 1.x para java 1.3 y 1.4:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.0.1</version> </dependency>
Caso 1: finally que asegura cerrar el Reader con el método close()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public void closeWithFinally(String filename) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(filename)); try { StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); } String contentFile = sb.toString(); System.out.println(contentFile); } finally { // Cerrar el reader reader.close(); } } |
Caso 2: Creando la instancia de BufferedReader dentro del try y validando si es null al momento de cerrar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public void closeWithFinallyNullCheck(String filename) throws IOException { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(filename)); String line = null; StringBuilder sb = new StringBuilder(); while ((line = reader.readLine()) != null) { sb.append(line); } String contentFile = sb.toString(); System.out.println(contentFile); } finally { // Cerrar el reader if (null != reader) { reader.close(); } } } |
Caso 3: Usando commons-io y la clase IOUtils se reduce bastante el código y quedaría algo así:
1 2 3 4 5 6 7 8 9 | public void closeWithFinallyCommonsIO(String filename) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(filename)); try { String contentFile = IOUtils.toString(reader); System.out.println(contentFile); } finally { IOUtils.closeQuietly(reader); } } |
Mas información en el maven site del proyecto:
Mas adelante escribiré un par de ejemplos con otras clases de commons-io que son bastante útiles.
Cómo iterar un Map con Java 1.5
1A pedido del Sr: @perrefe les dejo un tip de performance para iterar sobre Map<K,V>:
Supongamos que nuestro Map
1 | Map<String,Integer> map = new HashMap<String,Integer>(); |
Ahora podemos iterar el Map de la siguiente forma:
1 2 3 4 | for (Entry<String, Integer> entry : map.entrySet()) { System.out.println("Key [" + entry.getKey() + "]"); System.out.println("Value [" + entry.getValue() + "]"); } |
Si ve por ahí algún iterador sobre un Map
Por favor no haga esto!!!
1 2 3 4 5 6 7 | Set<String> keys = map.keySet(); for (String key : keys) { Integer value = map.get(key); System.out.println("Key [" + key + "]"); System.out.println("Value [" + value + "]"); } |
Espero les sirva.
Vala, Gtk, Pino y Twitter
2Últimamente en mis ratos de ocio he estado aprendiendo un lenguaje nuevo llamado Vala.
Mi desafío para aprender a hacer algo en vala + gtk fue agregar una funcionalidad al cliente de twitter Pino, que dicho sea de paso esta bastante bueno. La funcionalidad es bastante simple, agregar un nuevo proveedor para acortar URLs bit.ly
Complejidades, bondades y rarezas que me encontré:
- Facilidad para enganchar las señales.
- Lo parecido a Java del lenguaje, lo que me ayudo mucho, aquí una ayuda para los Java Developers
- Aún le falta mucho a los IDEs (valide esta muy verde).
- El compilador tiene poca ayuda, sólo dice que fallo pero no en donde ni por qué, rara vez te dice te falta un “;”
- Aun son enredado los script de compilación, al más puro estilo de macros m4, automake y vainas por el estilo, aquí hay mucho por mejorar.
- La API si bien es cierto esta bien documentada en valadoc aún prefiero la facilidad para encontrar las cosas del javadoc
Les dejo aquí mis mejoras de pino-twitter-2.0.5.tar y a ver si lo van mejorando un poco más, por lo pronto voy a subir los cambios al tracker para que los incluyan en la release.
Para compilar es simple, obviamente deben tener todas las herramientas para compilar:
$ ./waf configure --prefix=/home/tu_user/directorio_destino $ ./waf clean buid install $ cd /home/tu_user/directorio_destino/bin $ ./pino &
Espero sus comentarios
Problema de los botones de Eclipse en Ubuntu 9.10 Karmic
1Si te has vuelto mono haciendo clicks cuando trabajas con Eclipse en Ubuntu 9.10 Karmic Koala, aquí les dejo una solución que encontré por ahí:
Deben crear un pequeño script que configura una variable de entorno y luego llama al binario de eclipse, veamos el script eclipse.sh
#!/bin/sh export GDK_NATIVE_WINDOWS=1 cd $HOME/Software/eclipse ./eclipse
El problema (bug) al parecer es en cómo Eclipse a través de SWT hace uso de las librerías de GTK dejando inhabilitado las acciones de los botones y otros componentes como por ejemplo los árboles desplegables con checkbox (ventana de los updates).
Usando Apache Velocity
1
¿Que es Velocity?
Velocity es un proyecto de Apache para el desarrollo de Templates para la capa de vista dentro del modelo MVC, siendo esta última la mas conocida de todas las formas de uso de Velocity. Pero es mucho mas que eso, podemos usar el motor de Velocity para lo que necesitemos utilizando siempre el concepto de uso de templates.
¿Que es un template?
Como su nombre lo dice es una plantilla, les dejo un ejemplo de como seria una plantilla Velocity para una vista en html:
#set ($hola = "Hola Mundo") <h1>$hola</h1> ## Esto es una macro de Velocity #d() <h2>$salida</h2>
Donde:
- #set es una directiva para settear valores
- $hola es la variable setteada con el valor Hola Mundo
- #d() es una Velocimacro
- $salida es una variable de contexto que sera setteada desde la ejecución de Velocity (ver código fuente de java)
¿Cuando podemos utilizar Templates?, hay un sin número de aplicaciones, por ejemplo:
- Envío de mails personalizados, en este punto uno podría escribir los templates (email tipo) y dejar ciertos tags de Velocity (llamados directivas) para la personalización.
- Generar XML’s dinamicos.
- Generar otro tipo de salidas como por ejemplo JSON.
- Generar PDF mediante docbok, incluso otro tipo de archivos (rdf, txt)
- Y el mas usado, escribir templates para ser usados como html en la capa de vista.
Usando Velocity Engine
Primero creamos un proyecto con Maven2 para hacer la vida mas fácil y agregamos las siguientes dependencias:
<dependencies> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.5</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> </dependencies>
Luego creamos la clase que hará la pega de llamar a VelocityEngine, la carga del template y finalmente la salida.
package cl.firefox.pcollaog.velocity; import java.io.StringWriter; import java.io.Writer; import java.util.Properties; import org.apache.log4j.Logger; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; /** * <p> * </p> * <p> * $Id: VelocityEngine.java,v 1.1 2009-04-20 00:21:20 pcollaog Exp $ * </p> * * @author pcollaog * @version $Revision: 1.1 $ */ public class VelocityEngine { Logger logger = Logger.getLogger(VelocityEngine.class); private VelocityContext _ctx; private void init() throws Exception { logger.info("Inicializando Velocity"); Properties prop = new Properties(); // Carga archivo de propiedades de velocity prop.load(getClass() .getResourceAsStream("/velocity.properties")); // Inicializa Velocity Velocity.init(prop); _ctx = new VelocityContext(); } public String mergeTemplate() throws ResourceNotFoundException, ParseErrorException, Exception { init(); // Carga el template Template tpl = Velocity.getTemplate("template.vm"); // Agrega una variable al contexto luego puede ser usada // como $salida _ctx.put("salida", "OK"); // Creo un Writer para almacenar la salida Writer writer = new StringWriter(); // Genero la mezcla del template con sus las variables // del contexto y macros de velocity tpl.merge(_ctx, writer); // Finalmente genero un string con la salida return writer.toString(); } }
Espero que el código se explique por si solo.
Aquí dejo el ejemplo completo hecho con Maven2, para ver la ejecución, dentro del código fuente va un Test Unitario que imprime la salida de los templates.
$ mvn clean compile test
Baja el Source Code Aquí:
Ejemplo de Velocity versión no Servlet
Mas Información en: