pedroescudero.info Sobre programación, tecnología, etc

14dic/091

Bucles For-Each en Java

Uno de los tipos de bucle mas cómodos y estéticos del que no disponía Java cuando yo empecé a estudiar. Fue introducido en Java 1.5. La sintaxis del bucle for-each en Java es la siguiente.

public static void main(String args[])

{

for(String a : args)

{

System.out.println(a);

}

}

Creo que el ejemplo se explica a si mismo. Podríamos leer el operador ":" como "in" (dentro de).

El bucle for-each puede utilizarse con todas las clases que implementan la interfaz Iterable. Mas información, directamente de Sun.

Etiquetado con: , 1 Comentario
6oct/090

Especificar la codificación de caracteres

Siempre se debería especificar explícitamente la codificación que se está usando. De esta forma, evitaremos confusiones y malas conversiones y nos olvidaremos de los caracteres raros. La forma de especificarla dependerá del lenguaje que estemos usando.

Java

La Máquina Virtual Java (JVM) utiliza una codificación por defecto en aquellos casos en que sea necesaria una conversión entre bytes y caracteres o viceversa, y no se haya especificado explícitamente una codificación. Esta codificación por defecto suele ser la que utiliza el sistema operativo en donde se esté ejecutando. Por ejemplo, en sistemas Windows en español, suele ser windows-1252 (también conocida como cp1252).

La codificación por defecto que se esté usando se puede saber consultando el valor de la propiedad del sistema "file.encoding".

System.getProperty("file.encoding");

Asignando valor a esta propiedad se puede cambiar la codificación por defecto que usará la máquina virtual. Esto se puede hacer de 2 maneras, en el arranque indicándolo con un parámetro -D o programáticamente.

java -Dfile.encoding=UTF-8 jpereza.Clase
System.setProperty("file.encoding", "UTF-8");

Documentos XML

Los ficheros XML pueden comenzar con una cabecera, llamada prólogo, donde se puede especificar la codificación usada en el fichero. Dicho prólogo tiene el siguiente formato:

<?xml version="1.0" encoding="ISO-8859-1" ?>

El valor del atributo encoding es el nombre de la codificación empleada.

Si no se especifica ninguna codificación en el prólogo, se usará <abbr xml:lang="en" title="8-bit Unicode Transformation Format">UTF-8</abbr>.

Páginas HTML

Las páginas HTML utilizan una serie de etiquetas que ofrecen información sobre la propia página. En una de estas meta-etiquetas se puede especificar la codificación que se está usando.

<META httpequiv="ContentType" content="text/html; charset=UTF-8">

El atributo httpequiv con valor "ContentType" especifica el equivalente de la cabecera ContentType del protocolo HTTP. Como valor del atributo content se debe indicar el tipo de contenido, por ejemplo text/html, y el nombre de la codificación empleada, por ejemplo UTF-8.

Hojas de estilo CSS

En los ficheros de hojas de estilo CSS también se debería especificar la codificación usada. Esto no afecta a las declaraciones de estilo embebidas dentro de otro documento, ya que en este caso, se aplica la codificación especificada por el documento contenedor.

Se debe utilizar la regla @charset indicando el nombre de la codificación utilizada. Por ejemplo:

@charset "ISO-8859-1";

La regla @charset debe estar al principio del fichero. No debe estar precedida de ningún caracter, ni siquiera comentarios.

En el caso de documentos HTML, también se puede especificar la codificación de la hoja de estilos con el atributo charset de la etiqueta link. Por ejemplo:

<LINK rel="stylesheet" type="text/css" charset="UTF-8" href="estilos.css" />

Texto plano

Los ficheros de texto plano son aquellos ficheros de texto que no siguen un formato estandarizado, y por lo tanto no tienen definido cómo especificar la codificación empleada. Al no haber una forma de especificar la codificación en el propio fichero, ésta debería ser especificada por cualquier otro medio disponible, ya sea usando alguna convención o indicándolo en la documentación correspondiente.

5oct/090

Tratamiento de ficheros de texto en Java

La lectura y escritura de ficheros en Java se basa en las clases del paquete java.io. Existen dos grupos de clases, uno que trabaja con bytes, enfocado a ficheros binarios, y otro que trabaja con caracteres, enfocado a ficheros de texto. El grupo de los ficheros binarios se basan en las clases InputStream, para lectura, y OutputStream, para escritura. El grupo de los ficheros de texto se basa en las clases Reader, para lectura, y Writer, para escritura.

Java utiliza el estándar Unicode para representar internamente las cadenas de texto y representa cada carácter con un código de 16 bits usando la codificación UTF-16. Por lo tanto, es necesario realizar una conversión entre caracteres y bytes, y viceversa.

Para realizar esta conversión, se utilizan unas clases puente entre ambos grupos, InputStreamReader, para lectura, y OutputStreamWriter, para escritura. A estas clases se les puede especificar la codificación que deben utilizar para la transformación entre bytes y caracteres.

Si no se especifica una codificación en estas clases puente, o si se utilizan directamente las clases Reader o Writer, se utiliza la codificación por defecto de la máquina virtual para convertir los bytes en caracteres y viceversa. Esta codificación por defecto varía dependiendo de la plataforma dónde se esté ejecutando el código Java, por lo que muy probablemente sea distinta, por ejemplo, en una plataforma Windows y en una plataforma Unix. Esto puede llevar a una situación en la que, el mismo código Java, escribe ficheros con distintas codificaciones según dónde se ejecute.

Para evitar esto, nunca se deberían emplear directamente las clases Reader y Writer, si no que siempre se deben construir sobre una clase puente y especificando la codificación. Por ejemplo:

Writer escritor = new BufferedWriter(
                      new OutputStreamWriter(
                          new FileOutputStream("fichero.txt"),
                          "ISO-8859-1"
                      )
                  );
Reader lector = new BufferedReader(
                    new InputStreamReader(
                        new FileInputStream("fichero.txt"),
                        "ISO-8859-1"
                    )
                );

Ficheros .java

Los propios ficheros de código fuente de Java (con extensión .java) son ficheros de texto y como tales, puede ocurrir que no se traten con la codificación correcta y aparezcan caracteres raros.

El compilador de Java (javac), así como otras herramientas que procesan los ficheros de código fuente, como JavaDoc, tienen un atributo llamado encoding que permite especificar la codificación usada en estos ficheros. En los IDEs actuales suele haber una propiedad de configuración para especificar la codificación de nuestros ficheros, por lo que también hay que configurar correctamente los entornos de desarrollo.

También cuando se transfieren estos ficheros mediante algunos protocolos como FTP o CVS, pueden surgir caracteres raros. Esto se debe a que dichos protocolos pueden trabajar en dos modos: binario ó ASCII. En modo ASCII pueden utilizar sólo 7 bits de cada byte para obtener una mínima mejora de rendimiento. Por lo tanto, estos protocolos se deberían usar siempre en modo binario para evitar problemas.

Etiquetado con: , No hay comentarios
22jul/090

java.lang.OutOfMemoryError: Java heap space

En Java, podemos tener este error por diversos motivos. Una mala programación o una operación muy pesada pueden agotar la memoria RAM reservada a la máquina virtual y provocar que se lance esta excepción.

Si estamos en el segundo caso, una operación muy pesada, podemos solucionarlo ampliando la memoria de la máquina virtual Java. En la invocación de la máquina virtual añadiremos los siguientes parámetros:

-Xms<tamaño minimo>

-Xmx<tamaño maximo>

El tamaño puede expresarse en bytes, siendo la unidad por defecto, en kilobytes añadiendo la letra 'k' o 'K' detrás del valor numérico, megabytes añadiendo la letra 'm' o 'M' detrás del valor numérico, o gigabytes añadiendo la letra 'g' o 'G' detrás del valor numérico. El valor que utilicemos debe ser múltiplo de dos.

Algunos ejemplos:

-Xms6291456, -Xms6144k, -Xms1500M, -Xmx83886080, -Xmx81920k, -Xmx1500M

Etiquetado con: , , , No hay comentarios
21oct/080

Ejecutar .exe desde Java

Puedes ver como ejecutar un programa de Windows, (archivo ejecutable .exe, .bat, etc) desde Java en los siguientes ejemplos.

Ejecutar un .exe, en este caso el Bloc de notas.

public class Test
{
public static void main(String[] args)
{
Runtime aplicacion = Runtime.getRuntime();
try{aplicacion.exec("C:/Windows/System32/NOTEPAD.EXE"); }
catch(Exception e)
{
System.out.println(e);
}
}
}

Ejecutar un .bat, pudiendo ser fichero.bat cualquier grupo de comandos MS-DOS, usando cmd.exe.

public class Test
{
public static void main(String[] args)
{
Runtime aplicacion = Runtime.getRuntime();
try{aplicacion.exec("cmd.exe /K start C:/fichero.bat"); }
catch(Exception e)
{
System.out.println(e);
}
}
}