Entrada / Salida con Java
Una fuente de datos de tipo XML es un documento que no puede presentarse por sí mismo, necesita de algo más que se responsabilice de transformar los datos, puros y duros, en una página web. Éste es el papel de los estándares XSLT (Extensible Stylesheet Language Transformations) y XPath (XML Path Language). Ambos permiten crear presentaciones complejas partiendo de la información contenida en un origen de datos XML.
El funcionamiento es el siguiente: una hoja XSLT se aplica a un documento XML y el resultado suele ser por la general un fragmento de código HTML. El mecanismo no es nada complejo, pero puede desorientar al programador inicialmente: el desarrollo de una hoja XSLT implica un cambio metodológico con respecto al desarrollo, por ejemplo, de un programa en C, en Java o en cualquier otro lenguaje.
Desde el primer momento una hoja XSLT está concebida para tener siempre presente un documento XML, y esto cambia sustancialmente la lógica.
Por otro lado, el estándar XPath determina la forma de acceso, desde el código de la hoja XSLT, a los datos del documento XML. Desde un punto de vista estructural, de formato y de procedimiento, los documentos XML no guardan demasiada relación con las bases de datos al uso, por lo que ha sido necesario crear un nuevo sistema de acceso a estas fuente de datos. Este es el papel del estándard XPath.
A través de una serie de ejemplos sencillos se van a estudiar algunas de las operaciones de entrada/salida más comunes que suelen utilizar los programadores.
Leer un fichero de texto
El paquete java.io ofrece multitud de maneras de llevar a cabo de una de las operaciones de entrada/salida más habituales: leer un fichero de texto. Lo primero que hay que tener en cuenta es que un fichero de texto es, como su proprio nombre indica, un fichero orientado a caracteres. Por lo tanto, es preciso utilizar una clase adecuada para este tipo de datos. En principio, la clase FileReader, que pertenece al paquete java.io.Reader, se ajusta perfectamente a nuestras necesidades.
El siguiente fragmento de código muestra cómo se puede leer un fichero de texto.
FileReader fr = null;
try {
String sFilePath = "C:\\FICHEROS\\in.txt";
fr = new FileReader(sFilePath);
char[] data = new char[1024];
int iCharsRead;
StringBuffer sb = new StringBuffer();
while ((iCharsRead = fr.read(data, 0, 1024)) != -1) {
sb.append(data, 0, iCharsRead);
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fr == null) fr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
En primer lugar se define una variable perteneciente a la clase FileReader. Inicialmente toma el valor null. La parte principal del código se encuentra dentro de un bloque try...catch...finally. Java garantiza que la cláusula finally se ejecuta con independencia de lo que ocurra dentro del bloque try...catch. Por lo tanto la claúsula finally es el lugar adecuado para cerrar el canal de lectura abierto. De este modo, se tiene la completa seguridad de que el recurso se libera al completo.
La variable sFilePath almacena la ruta completa del fichero. Nótese que el símbolo \ debe escribirse dos veces porque es el carácter reservado para las secuencias de escape. Abrir el fichero es tan simple como crear una instancia de la clase FileReader, pasando como parámetro la ruta completa del fichero. A partir de este momento se pueden acceder al contenido del fichero de texto de muy diversas formas. Una de las más eficientes consiste en leer bloques de caracteres y ésta es la empleada en el ejemplo que se está mostrando.
La variable data representa un array de elementos de tipo char, es decir, caracteres. Es capaz de almacenar hasta 1.024 caracteres. iCharsRead es una variable que se emplea para guardar el número de caracteres que de verdad se han leído en cada llamada al método read. Finalmente, un objeto de tipo StringBuffer es el que va a almacenar todos los caracteres leídos.
El método read recibe tres parámetros. El primero es el array de datos donde se van a depositar los caracteres leídos del fichero de texto. El segundo es la posición del array a partir de la cual se van a despositar dichos caracteres. Finalmente, el último de los parámetros representa el número máximo de caracteres que deben leerse, o lo que es lo mismo, el número máximo de caracteres que se pueden almacenar en el array a partir de la posición indicada. Los valores 0 y 1.024 del ejemplo indican se van a leer hasta 1.024 caracteres en cada vuelta del bucle while. El método read devuelve un valor de tipo int. Éste contiene el número real de caracteres que finalmente se han leído o –1 en el caso de que se haya llegado al final del fichero de texto. Este valor no tiene que coincidir con el número máximo de caracteres que se pueden almacenar en el array. Siguiendo con el ejemplo,