ÍNDICE 
 AUTORES 

Guía de iniciación al Lenguaje Java en formato HTML

PARTE III: Bibliotecas del lenguaje

1. Entrada/Salida

Contenidos de esta página:

A. INTRODUCCIÓN *

B. ENTRADA/SALIDA ESTÁNDAR *

a. System.in *

b. System.out *

c. System.err *

C. ENTRADA/SALIDA POR FICHERO *

D. FileInpoutStream *

a. Apertura *

b. Lectura *

c. Cierre *

d. Ejemplo *

E. FileOutputStream *

a. Apertura *

b. Escritura *

c. Cierre *

d. Ejemplo *

F. DataInputStream *

a. Apertura *

b. Lectura *

c. Cierre *

G. DataOutputStream *

a. Apertura *

b. Escritura *

c. Cierre *

H. RandomAccessFile *

a. Apertura *

b. Acceso a la información *

A. INTRODUCCIÓN

Normalmente, cuando nos ponemos a codificar un programa, lo hacemos con la intención de que ese programa pueda interactuar con los usuarios del mismo, es decir, que el usuario pueda pedirle que realice cosas y pueda suministrarle datos con los cuales quiere que haga algo. Una vez introducidos los datos y la orden, se espera que el programa manipule de alguna forma esos datos para proporcionarnos una respuesta a lo solicitado.

Además, en muchas ocasiones, nos interesará que el programa guarde memoria de los datos que le hemos introducido, de forma que si terminamos el programa los datos no se pierdan y puedan ser recuperados en una sesión posterior. La forma más normal de hacer esto es mediante la utilización de ficheros que se guardarán en un dispositivo de memoria no volátil (normalmente un disco).

A todas estas operaciones que constituyen un flujo de información del programa con el exterior se le conoce como entrada/salida.

Como se ha reflejado en los párrafos anteriores, existen dos tipos de entrada/salida bien diferenciados, la Entrada/Salida Estándar que se realiza con el terminal del usuario y la Entrada/Salida a través de fichero.

B. ENTRADA/SALIDA ESTÁNDAR

Aquí sólo trataremos la entrada/salida que se comunica con el usuario a través de la pantalla o de la ventana del terminal. Es decir, si creamos un applet no se utilizarán normalmente estas funciones, ya que su resultado se mostrará en la ventana del terminal y no en la ventana del applet. La ventana del applet es una ventana gráfica y para poder realizar una entrada o salida a través de ella será necesario utilizar AWT.

El acceso a la entrada y salida estándar es controlada por tres objetos que se crean automáticamente al iniciar la aplicación. Estos tres objetos son System.in, System.out y System.err

a. System.in

Este objeto implementa la entrada estándar (normalmente el teclado). Los métodos que nos proporciona para controlar la entrada son:

b. System.out

Este objeto implementa la salida estándar. Los métodos que nos proporciona para controlar la salida son:

c. System.err

Este objeto implementa la salida en caso de error. Normalmente esta salida es la pantalla o la ventana del terminal como con System.out, pero puede ser interesante redefinirlo, por ejemplo hacia un fichero, para diferenciar claramente un tipo de salida de otra.

Las funciones que nos ofrece este objeto son idénticas a las proporcionadas por System.out.

A continuación vemos un ejemplo del uso de estas funciones que acepta texto hasta que se pulsa el retorno de carro e informa del número de caracteres introducidos.

import java.io.*;

class CuentaCaracteres {

public static void main(String args[]) throws IOException {

int contador=0;

while(System.in.read()!='\n')

contador++;

System.out.println();

System.out.println("Tecleados "+contador+" caracteres.");

}

}

C. ENTRADA/SALIDA POR FICHERO

En Java es posible utilizar dos tipos de ficheros, ficheros de texto y ficheros binarios.

Existen varias clases de las cuales podemos crear instancias. Estas instancias van a representar ficheros de uno u otro tipo y abiertos de un modo especifico. Las principales clases existentes son:

D. FileInpoutStream

Los objetos instanciados de esta clase representan ficheros de texto de sólo lectura que se acceden de forma secuencial.

a. Apertura

Para abrir un fichero de texto en modo lectura no tenemos más que crear un objeto de la clase FileInputStream de la siguiente forma:

FileInputStream objeto=new FileInputStream(rutafichero);

b. Lectura

La lectura del fichero se realiza mediante la función read del objeto creado. Esta función se puede invocar de muchas formas.

c. Cierre

Para cerrar un fichero lo que hay que hacer es destruir el objeto, esto se puede realizar de dos formas, dejando que sea el recolector de basura de Java el que lo destruya cuando no lo necesite (no se recomienda) o destruyendo el objeto explícitamente mediante el uso del procedimiento Close() del objeto.

objeto.close()

d. Ejemplo

El siguiente ejemplo abre el fichero de texto /ej/carta.txt y muestra su información en pantalla.

import java.io.*;

class MuestraCarta {

public static void main(String args[]) throws IOException {

int c;

FileInputStream f=new FileInputStream("/ej/carta.txt");

while((c=f.read())!=-1)

System.out.print((char)c);

f.close();

}

}

E. FileOutputStream

Los objetos instanciados de esta clase representan ficheros de texto para escritura que se escriben de forma secuencial.

a. Apertura

Para abrir un fichero de texto para escritura no tenemos más que crear un objeto de la clase FileInputStream de la siguiente forma:

FileOutputStream objeto=new FileOutputStream(rutafichero);

b. Escritura

Una vez abierto el fichero podemos escribir en el con la función write del objeto creado. Al igual que read esta función tiene varios formatos.

c. Cierre

El cierre de un objeto de tipo FileOutputStream es absolutamente idéntico al cierre de objetos FileInputStream, se puede cerrar de forma implícita o de forma explica con el método Close() del objeto.

d. Ejemplo

El siguiente ejemplo crea el fichero de texto /ej/carta.txt de la sección anterior a partir de un texto que se le introduce por teclado.

import java.io.*;

class CreaCarta {

public static void main(String args[]) throws IOException{

int c;

FileOutputStream f=new FileOutputStream("/ej/carta.txt");

while((c=System.in.read())!=EOF)

f.print((char)c);

f.close();

}

}

F. DataInputStream

Los objetos instanciados de esta clase representan ficheros binarios de sólo lectura que se acceden de forma secuencial.

Este tipo de ficheros se comportan de forma similar a los de texto, pero a diferencia de estos, en ver de caracteres sueltos, pueden leer cualquier tipo de variables como floats, ints o chars.

a. Apertura

Es similar a los ficheros de texto. Abrir un fichero binario de sólo lectura consiste en crear un objeto de la clase DataInputStream de la siguiente forma:

DataInputStream objeto=new DataInputStream(rutafichero);

b. Lectura

La lectura del fichero se realiza con una función que depende el tipo de datos que queremos leer.

Cada una de ellas lee un dato del tipo especificado. Si no es posible la lectura devuelven –1. La función lee una cadena hasta encontrarse un retorno de carro, salto de línea, ambos o el fin del fichero.

c. Cierre

Idéntico a los modos anteriores, implícitamente o explícitamente con la función Close() del objeto.

objeto.close()

G. DataOutputStream

Los objetos instanciados de esta clase representan ficheros binarios para escritura secuencial.

Este tipo de ficheros se comportan de forma similar a los de texto, pero a diferencia de estos, en ver de caracteres sueltos, pueden escribir cualquier tipo de variables como floats, ints o chars.

a. Apertura

Es similar a los ficheros de texto. Abrir un fichero binario para escritura consiste en crear un objeto de la clase DataOutputStream de la siguiente forma:

DataOutputStream objeto=new DataOutputStream(rutafichero);

b. Escritura

La escritura del fichero se realiza con una función que depende el tipo de datos que se desee escribir.

c. Cierre

Idéntico a los modos anteriores, implícitamente o explícitamente con la función Close() del objeto.

objeto.close()

H. RandomAccessFile

La clase RandomAccessFile es la base para crear los objetos de tipo fichero de acceso aleatorio, estos ficheros, se pueden manejar a placer, saltar hacia delante y hacia atrás para leer la información que necesitemos en cada momento, e incluso leer o escribir partes del fichero sin necesidad de cerrarlo y volverlo a abrir en un modo distinto.

Se puede añadir datos a un fichero ya existente sin más que saltar al final de este y escribir datos a partir de allí.

a. Apertura

Abrir un fichero de acceso aleatorio consiste en crear un objeto de la clase RandomAccessFile de la siguiente forma:

RandomAccessFile objeto = new RandomAccessFile(rutafichero,modo);

En donde modo es una cadena de texto que indica el modo en que se desea abrir el fichero, sólo lectura "r", o lectura/escritura "r/w".

b. Acceso a la información

Con los objetos de tipo fichero aleatorio se pueden utilizar todas las funciones que se podían usar con los ficheros binarios DataInputStream y DataOutputStream.

Además, se cuenta con una serie de funciones para realizar el desplazamiento del puntero del fichero. Hay que tener en cuenta que cualquier lectura o escritura de datos se realizará a partir de la posición actual del puntero del fichero.