Вы находитесь на странице: 1из 4

ARCHIVOS DE ENTRADA/SALIDA EN JAVA

class CuentaCaracteres {
A. Introducción
Normalmente, en muchas ocasiones interesa que el public static void main(String args[]) throws IOException
programa guarde los datos que se le han introducido, de {
forma que si el programa termina los datos no se pierdan
y puedan ser recuperados en una sesión posterior. La int cont=0;
forma más normal de hacer esto es mediante la utilización while(System.in.read()!='\n') cont++;
de archivos que se guardarán en un dispositivo de
memoria no volátil (normalmente un disco). System.out.println(); // Retorno de carro "gratuito"
Existen dos tipos de Entrada/Salida (E/S): la estándar a System.out.println("Tecleados ” +cont+" caracts.");
través de teclado y la E/S a través de archivos en disco. }
}
Todas las operaciones de E/S en Java vienen en el
paquete estándar de la API Java denominado java.io que C. Entrada/Salida por archivo
incorpora interfaces, clases y excepciones para acceder a a.) Tipos de archivos
todo tipo de archivos. En Java se utilizan dos tipos (de texto o binarios) y dos
tipos de acceso a los archivos (secuencial o aleatorio).
B. Entrada/Salida estándar Los archivos de texto están compuestos de caracteres.
Si creamos una applet no se utilizarán estas funciones, ya Los binarios almacenan cualquier tipo de datos ( int, float,
que su resultado se mostrará en la ventana modo terminal boolean,...).
o consola, y no en la ventana de la applet. La ventana de Una lectura secuencial acceder a un elemento antes de
la applet es una ventana gráfica y para poder realizar una acceder al siguiente (sin saltos). Un archivo de acceso
entrada o salida a través de ella será necesario utilizar el aleatorio permite acceder a sus datos, indicando una
AWT o SWING. determinada posición desde la cual leer/escribir.
La entrada y salida estándar es controlada por tres b.) Clases del paquete java.io para tratar archivos.
objetos que se crean automáticamente al iniciar la Sólo vamos a trata las tres principales:
aplicación: System.in, System.out y System.err  FileOutputStream: Archivo de salida de texto. Se
a.) System.in accede de forma secuencial.
Entrada normalmente el teclado. Los métodos para  FileInputStream: Archivo de entrada de texto. Se
controlar la entrada son: accede de forma secuencial.
 read(): Devuelve el carácter escrito por teclado  RandomAccessFile: Archivos de entrada o salida
leyéndolo del buffer de entrada y lo elimina del buffer binario con acceso aleatorio. Permiten multitud de
para la siguiente lectura de otro carácter. Si no se operaciones; saltar hacia delante y hacia atrás
escribe ningún carácter devuelve -1. para leer la información que necesitemos en cada
 skip(n): Ignora n caracteres siguientes leidos. momento, e incluso leer o escribir partes del
b.) System.out archivo sin necesidad de cerrarlo y volverlo a
Salida estándar. para controlar la salida son: abrir en un modo distinto.
 print(a): Imprime a en la salida, a puede ser cualquier
tipo de dato; Java le hace su conversión automática a c.) Generalidades
cadena.
 println(a): se imprime salto de línea al final. 1. Abrir el archivo.
c.) System.err Se crear un objeto de la clase correspondiente y el tipo
Salida en caso de error. Normalmente es la pantalla o la de acceso que vamos a utilizar:
consola como con System.out. puede redirigirse hacia un TipoDeArchivo obj = new TipoDeArchivo( Ruta );
archivo. Las funciones son idénticas a las de System.out. Ruta: donde esta el archivo o un descriptor válido.
d.) Ejemplo
Ejemplo: aceptar texto hasta pulsar el retorno de carro e Para los objetos RandomAccessFile (acceso aleatorio), se
informa del número de caracteres introducidos. ha de instanciar de la siguiente forma:
RandomAccessFile obj = new RandomAccessFile( ruta,
import java.io.*; modo );
modo:; "r" para lectura / "rw" para lectura y escritura.  int read ( byte a[], int off, int len ): Lee len
caracteres, insertándolos en el vector a.
3. Gestión de excepciones. Todos ellos devuelven -1 si llegamos hasta el final del
Los métodos que utilicen clases de este paquete deben archivo (momento para cerrarlo).
tener en su definición una cláusula throws IOException.
pueden lanzar excepciones de esta clase (o sus hijas) en Ejemplo mostrar el archivo "/carta.txt" en pantalla:
su ejecución, que deben de ser capturadas y
debidamente gestionadas. import java.io.*;
4. Se cierra el archivo y se destruye el objeto. class MuestraCarta
Esto se puede realizar de dos formas, dejando que sea el {
recolector de basura de Java el que lo destruya cuando public static void main(String args[]) throws IOException
no lo necesite (no se recomienda) o destruyendo el objeto {
explícitamente mediante un close() del objeto: obj.close()
int c;
d.) La clase FileOutputStream FileInputStream f=new FileInputStream("/carta.txt");
Escribimos en archivos de texto de forma secuencial.
Presenta el método write() para la escritura: while( ( c=f.read() ) != -1 )

 int write( int c ): Escribe el carácter “c”. System.out.print( (char)c );


 int write( byte a[] ): Escribe los datos del arreglo.
 int write( byte a[], int offset, int lenth ): Escribe f.close();
lenth caracteres del vector a, desde la posición
offset. }
Ejemplo: }
creaR el archivo "/carta.txt" DESDE teclado:
f.) La clase RandomAccessFile
import java.io.*; Utilizamos archivos binarios en acceso aleatorio, tanto
class CreaCarta para lectura como para escritura. En estos archivos hay
{ un índice que nos dice en qué posición del archivo nos
encontramos, y para posicionarse en el archivo.
public static void main(String args[]) throws IOException{
Métodos de desplazamiento del puntero del archivo.
int c; Cualquier lectura o escritura de datos se realizará a partir
FileOutputStream f=new FileOutputStream ("/carta.txt"); de la posición actual del puntero del archivo.

while( ( c=System.in.read() ) != -1 )  long getFilePointer();Devuelve la posición actual


f.write ( (char)c ); del puntero del archivo.
f.close();  void seek( long l ); Coloca el puntero en la
} posición l. Un archivo empieza en la posición 0.
}  int skipBytes( int n ); salta n bytes desde la
posición actual.
e.) La clase FileInputStream  long length(); Devuelve la longitud del archivo.
LeeR de archivos de texto de forma secuencial.  Void setLength( long l); da l como tamaño del
Presenta el método read() para la lectura del archivo : arch.
 int read(): Devuelve el siguiente carácter.  FileDescriptor getFD(); Devuelve su descriptor.
 int read( byte a[] ): Llena el vector a con los 
caracteres leídos del archivo. Devuelve la Métodos de escritura según el tipo de datos a escribir:
longitud del vector que se ha llenado si se realizó  void write( byte b[], int desde, int len ); Escribe len
con éxito o –1 si no había suficientes caracteres caracteres del vector b.
en el archivo para llenar el vector.  void write( int i ); Escribe la parte baja de i (un
byte) en el flujo.
 void writeBoolean( boolean b ); Escribe el RandomAccessFile f=new RandomAccessFile(ruta,"rw");
boolean b como un byte. // E/S
 void writeByte( int i ); Escribe i como un byte.
 void writeBytes( String s ); Escribe s tratada como for ( int i=1; i <= 100 ; i++ )
bytes, no caracteres.
 void writeChar( int i ); Escribe i como 1 byte. {
 void writeChars( String s ); Escribe la cadena s. try{
 void writeDouble( double d ); Convierte d a long y f.writeByte( i );
le escribe como 8 bytes. } catch( IOException e){
// Gestion de excepcion de ejemplo
 void writeFloat( float f ); Convierte f a entero y le
break; // No se puede seguir escribiendo
escribe como 4 bytes.
}
 void writeInt( int i ); Escribe i como 4 bytes.
f.close();
 void writeLong( long v ); Escribe v como 8 bytes. }
 void writeShort( int i ); Escribe i como 2 bytes. }
 void writeUTF( String s ); Escribe la cadena s
utilizando la codificación UTF-8. El siguiente método accede al elemento cual de un
Los métodos que escriben números de más de un byte archivo binario, imprimiendo la longitud del archivo, el
escriben el primero, su parte alta. elemento cual y su 10 veces siguiente elemento:

Métodos de lectura segun del tipo de datos: static void imprimeEltoN(String ruta, long cual)
 boolean readBoolean(); Lee un byte y devuelve throws IOException{
false si vale 0 o true sino.
 byte readByte(); Lee y devuelve un byte. RandomAccessFile f=new RandomAccessFile(ruta,"r"); //
 char readChar(); Lee y devuelve un caracter. E/
 double readDouble(); Lee 8 bytes, y devuelve un System.out.print( "El archivo " + ruta );
double. System.out.println( " ocupa " + f.length() + " bytes." );
 float readFloat(); Lee 4 bytes, y devuelve un float. f.seek( cual-1 ); // Me posiciono (-1 porque empieza en
 void readFully( byte b[] ); Lee bytes del archivo y 0)
los almacena en un vector b.
 void readFully( byte b[], int ini, int len ); Lee len System.out.print(" En la posicion " + f.getFilePointer() );
bytes del archivo y los almacena en un vector b. System.out.println(" esta el numero " + f.readByte() );
 int readInt(); Lee 4 bytes, y devuelve un int.
 long readLong(); Lee 8 bytes, y devuelve un long. f.skipBytes( 9 ); // Salto 9 => Elemento 10 mas alla
System.out.print(" 10 elementos más allá, esta el ");
 short readShort(); Lee 2 bytes, y devuelve un
System.out.println( f.readByte() );
short.
f.close();
 int readUnsignedByte(); Lee 1 byte, y devuelve un
}
valor de 0 a 255.
 int readUnsignedShort(); Lee 2 bytes, y devuelve Si incluimos ambos métodos en una clase, y les llamamos
un valor de 0 a 65535. con el siguiente programa principal ( main()):
 String readUTF(); Lee una cadena codificada con public static void main(String args[]) throws IOException {
el formato UTF-8. String ruta="numeros.dat"; // Archivo
 int skipBytes(int n); Salta n bytes del archivo. creaFichBin( ruta ); // Se crea
Si no es posible la lectura devuelven –1. imprimeEltoN( ruta, 14 ); // Accedo al elemento 14.
Ejemplo }
crear y acceder a un archivo binario, acceso aleatorio,
que contiene los 100 primeros números (en orden): Obtendremos la siguiente salida:
El archivo numeros.dat ocupa 100 bytes.
static void creaFichBin( String ruta ) throws IOException { En la posicion 13 esta el numero 14
10 elementos más allá, esta el 24
http://pisuerga.inf.ubu.es/lsi/Invest/Java/Tuto/III_3.htm

Вам также может понравиться