clases as para el manejo de archivos en java

21
 Introducción Los archivos también denominados ficheros (files); son una colección de información (datos relacionados entre sí), localizada o almacenada como una unidad en alguna parte de la computadora. Los archivos son el conjunto organizado de informaciones del mismo tipo, que pueden utilizarse en un mismo tratamiento; como soporte material de estas informaciones. Los archivos pueden ser contrastados con Arrays y registros; Lo que resulta dinámico y por esto en un registro se deben especificar los campos, él número de elementos de un arrays (o arreglo), el número de caracteres en una cadena; por esto se denotan como "Estructuras Estáticas". En los archivos no se requiere de un tamaño predeterminado; esto significa que se pueden hacer archivos de datos más grandes o pequeños, según se necesiten. Cada archivo es referenciado por su identificador (su nombre.). Los archivos como colección de datos sirven para la entrada y salida a la computadora y son manejados con programas a través de Clases predefinidas para tal fin. Clases predefinidas para el manejo de archivos en JAVA Todos los lenguajes de programación tienen alguna forma de interactuar con los sistemas de ficheros locales; Java no es una excepción. Cuando se desarrollan applets para utilizar en red, hay que tener en cuenta que la entrada/salida directa a fichero es una violación de seguridad de acceso. Muchos usuarios configurarán sus navegadores para permitir el acceso al sistema de ficheros, pero otros no. Por otro lado, si se está desarrollando una aplicación Java para uso interno, probablemente será necesario el acceso directo a ficheros. Antes de realizar acciones sobre un fichero, necesitamos un poco de información sobre ese fichero. La clase File proporciona muchas utilidades relacionadas con ficheros y con la obtención de información básica sobre esos ficheros. Creación de un objeto File Para crear un objeto File nuevo, se puede utilizar cualquiera de los tres constructores siguientes:

Upload: sergio-gonzalez-gonzalez

Post on 13-Jul-2015

728 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 1/21

Introducción

Los archivos también denominados ficheros (files); son una colección deinformación (datos relacionados entre sí), localizada o almacenada como una

unidad en alguna parte de la computadora.

Los archivos son el conjunto organizado de informaciones del mismo tipo, quepueden utilizarse en un mismo tratamiento; como soporte material de estasinformaciones.

Los archivos pueden ser contrastados con Arrays y registros; Lo que resultadinámico y por esto en un registro se deben especificar los campos, él número deelementos de un arrays (o arreglo), el número de caracteres en una cadena; poresto se denotan como "Estructuras Estáticas".

En los archivos no se requiere de un tamaño predeterminado; esto significa que sepueden hacer archivos de datos más grandes o pequeños, según se necesiten.

Cada archivo es referenciado por su identificador (su nombre.).

Los archivos como colección de datos sirven para la entrada y salida a lacomputadora y son manejados con programas a través de Clases predefinidaspara tal fin.

Clases predefinidas para el manejo de archivos en JAVA

Todos los lenguajes de programación tienen alguna forma de interactuar con lossistemas de ficheros locales; Java no es una excepción.

Cuando se desarrollan applets para utilizar en red, hay que tener en cuenta que laentrada/salida directa a fichero es una violación de seguridad de acceso. Muchosusuarios configurarán sus navegadores para permitir el acceso al sistema deficheros, pero otros no.

Por otro lado, si se está desarrollando una aplicación Java para uso interno,probablemente será necesario el acceso directo a ficheros.

Antes de realizar acciones sobre un fichero, necesitamos un poco de información

sobre ese fichero. La clase File proporciona muchas utilidades relacionadas conficheros y con la obtención de información básica sobre esos ficheros.

Creación de un objeto File

Para crear un objeto File nuevo, se puede utilizar cualquiera de los tresconstructores siguientes:

Page 2: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 2/21

File miFichero; miFichero = new File( "/etc/kk" );

o

miFichero = new File( "/etc","kk" );

o

File miDirectorio = new File( "/etc" );

miFichero = new File( miDirectorio,"kk" );

El constructor utilizado depende a menudo de otros objetos File necesarios para elacceso. Por ejemplo, si sólo se utiliza un fichero en la aplicación, el primerconstructor es el mejor. Si en cambio, se utilizan muchos ficheros desde un mismodirectorio, el segundo o tercer constructor serán más cómodos. Y si el directorio oel fichero es una variable, el segundo constructor será el más útil.

Comprobaciones y Utilidades

Una vez creado un objeto File, se puede utilizar uno de los siguientes métodospara reunir información sobre el fichero:

Nombres de fichero

String getName() String getPath() String getAbsolutePath() String getParent()boolean renameTo( File nuevoNombre )

Comprobaciones

boolean exists() boolean canWrite() boolean canRead() boolean isFile() booleanisDirectory() boolean isAbsolute()

Información general del fichero

long lastModified() long length()

Utilidades de directorio

boolean mkdir() String[] list()

Ejemplo de una pequeña aplicación que muestra información sobre los ficherospasados como argumentos en la línea de comandos, InfoFichero.java:

import java.io.*;

class InfoFichero

Page 3: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 3/21

{

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

{

if( args.length > 0 )

{

for( int i=0; i < args.length; i++ )

{

File f = new File( args[ i ] );

System.out.println( "Nombre: "+f.getName( ) );

System.out.println( "Camino: "+f.getPath( ) );

if( f.exists( ) )

{

System.out.print( "Fichero existente " );

System.out.print( (f.canRead() ? " y se puede Leer" : "" ) );

System.out.print( (f.canWrite() ? " y se puede Escribir" : "" ) );

System.out.println( "." );

System.out.println( "La longitud del fichero son "+ f.length()+" bytes" );

}

else System.out.println( "El fichero no existe." );

}

}

else

System.out.println( "Debe indicar un fichero." );

}

}

Streams de entrada

Hay muchas clases dedicadas a la obtención de entrada desde un fichero. Este esel esquema de la jerarquía de clases de entrada por fichero:

Page 4: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 4/21

 

Objetos FileInputStream

Los objetos FileInputStream típicamente representan ficheros de texto accedidosen orden secuencial, byte a byte. Con FileInputStream, se puede elegir acceder a

un byte, varios bytes o al fichero completo.

Apertura de un FileInputStream

Para abrir un FileInputStream sobre un fichero, se le da al constructor un String oun objeto File:

FileInputStream mi FicheroSt; miFicheroSt = new FileInputStream( "/etc/kk" );

También se puede utilizar:

File miFichero FileInputStream miFicheroSt; miFichero = new File( "/etc/kk" );miFicheroSt = new FileInputStream( miFichero );

Lectura de un FileInputStream

Una vez abierto el FileInputStream, se puede leer de él. El método read() tienemuchas opciones:

int read();

Lee un byte y devuelve -1 al final del stream.int read( byte b[ ] );

Llena todo el array, si es posible. Devuelve el número de bytes leídos o -1 si sealcanzó el final del stream.

int read( byte b[ ],int offset,int longitud );

Lee longitud bytes en b comenzando por b[ offset ]. Devuelve el número de bytesleídos o -1 si se alcanzó el final del stream.

Cierre de FileInputStream

Cuando se termina con un fichero, existen dos opciones para cerrarlo:explícitamente, o implícitamente cuando se recicla el objeto (el garbage collectorse encarga de ello).

Page 5: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 5/21

Para cerrarlo explícitamente, se utiliza el método close():

miFicheroSt.close();

Ejemplo: Visualización de un fichero

Si la configuración de la seguridad de Java permite el acceso a ficheros, se puedever el contenido de un fichero en un objeto TextArea. El código siguiente contienelos elementos necesarios para mostrar un fichero:

FileInputStream fis;

TextArea ta;

public void init( )

{

byte b[ ] = new byte[1024];

int i; /* El buffer de lectura se debe hacer lo suficientemente grande o esperar a saber el tamañodel fichero*/ 

String s;

try { fis = new FileInputStream( "/etc/kk" ); }

catch( FileNotFoundException e ) { /* Hacer algo */ }

try { i = fis.read( b ); }

catch( IOException e ) { /* Hacer algo */ }

s = new String( b,0 );

ta = new TextArea( s,5,40 );

add( ta );

}

Objetos DataInputStream

Los objetos DataInputStream se comportan como los FileInputStream. Losstreams de datos pueden leer cualquiera de las variables de tipo nativo, comofloats, ints o chars. Generalmente se utilizan DataInputStream con ficherosbinarios.

Apertura y cierre de DataInputStream

Para abrir y cerrar un objeto DataInputStream, se utilizan los mismos métodos quepara FileInputStream:

DataInputStream miDStream;

FileInputStream miFStream; //Obtiene un controlador de fichero miFStream = new

FileInputStream "/etc/ejemplo.dbf"); //Encadena un fichero de entrada de datos miDStream = new

DataInputStream( miFStream );//Ahora se pueden utilizar los dos streams de entrada para acceder

 //al fichero (si se quiere...)

Page 6: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 6/21

miFStream.read( b );

i = miDStream.readInt(); //Cierra el fichero de datos explícitamente, siempre se cierra primero el

fichero stream de mayor nivel

miDStream.close();

miFStream.close();

Lectura de un DataInputStream

Al acceder a un fichero como DataInputStream, se pueden utilizar los mismosmétodos read() de los objetos FileInputStream. No obstante, también se tieneacceso a otros métodos diseñados para leer cada uno de los tipos de datos:

byte readByte( )

int readUnsignedByte( )

short readShort( )

int readUnsignedShort( )

char readChar( )

int readInt( )

long readLong( )

float readFloat( )

double readDouble( )

String readLine( )

Cada método leerá un objeto del tipo pedido.

Para el método String readLine( ), se marca el final de la cadena con n, r, rn o conEOF.

Para leer un long, por ejemplo:

long numeroSerie; ... numeroSerie = miDStream.readLong();

Streams de entrada de URLs

Además del acceso a ficheros, Java proporciona la posibilidad de acceder a URLscomo una forma de acceder a objetos a través de la red. Se utiliza implícitamenteun objeto URL al acceder a sonidos e imágenes, con el métodogetDocumentBase() en los applets:

Page 7: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 7/21

String imagenFich = new String( "imagenes/pepe.gif" ); imagenes[0] = getImage(getDocumentBase(),imagenFich );

No obstante, se puede proporcionar directamente un URL, si se quiere:

URL imagenSrc; imagenSrc = new URL( "http://enterprise.com/~info" );imagenes[0] = getImage( imagenSrc,"imagenes/pepe.gif" );

Apertura de un Stream de entrada de URL

También se puede abrir un stream de entrada a partir de un URL. Por ejemplo, sepuede utilizar un fichero de datos para un applet:

ImputStream is; byte buffer[] = new byte[24]; is = new URL(getDocumentBase(),datos).openStream();

Ahora se puede utilizar is para leer información de la misma forma que se hacecon un objeto FileInputStream:

is.read( buffer,0,buffer.length );

NOTA: Debe tenerse muy en cuenta que algunos usuarios pueden haberconfigurado la seguridad de sus navegadores para que los applets no accedan aficheros.

Streams de salida

La contrapartida necesaria de la lectura de datos es la escritura de datos. Comocon los Streams de entrada, las clases de salida están ordenadas

 jerárquicamente:

Examinaremos las clases FileOutputStream y DataOutputStream paracomplementar los streams de entrada que se han visto. En los ficheros fuente del

Page 8: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 8/21

directorio $JAVA_HOME/src/java/io se puede ver el uso y métodos de estasclases, así como de los streams de entrada ($JAVA_HOME es el directorio dondese halla instalado el Java Development Kit, en sistemas UNIX).

Objetos FileOutputStreamLos objetos FileOutputStream son útiles para la escritura de ficheros de texto.Como con los ficheros de entrada, primero se necesita abrir el fichero para luegoescribir en él.

Apertura de un FileOutputStream

Para abrir un objeto FileOutputStream, se tienen las mismas posibilidades quepara abrir un fichero stream de entrada. Se le da al constructor un String o unobjeto File.

FileOutputStream miFicheroSt;

miFicheroSt = new FileOutputStream( "/etc/kk" );

Como con los streams de entrada, también se puede utilizar:

File miFichero FileOutputStream miFicheroSt;

File miFichero FileOutputStream miFicheroSt; miFichero = new File( "/etc/kk" );miFicheroSt = new FileOutputStream( miFichero );

Escritura en un FileOutputStream

Una vez abierto el fichero, se pueden escribir bytes de datos utilizando el métodowrite(). Como con el método read() de los streams de entrada, tenemos tresposibilidades:

void write( int b );

Escribe un byte.

void write( byte b[ ] );

Escribe todo el array, si es posible.

void write( byte b[ ],int offset,int longitud );

Escribe longitud bytes en b comenzando por b[offset].

Page 9: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 9/21

Cierre de FileOutputStream

Cerrar un stream de salida es similar a cerrar streams de entrada. Se puedeutilizar el método explícito:

miFicheroSt.close();

O, se puede dejar que el sistema cierre el fichero cuando se recicle miFicheroSt.

Ejemplo: Almacenamiento de Información

Este programa, Telefonos.java, pregunta al usuario una lista de nombres ynúmeros de teléfono. Cada nombre y número se añade a un fichero situado enuna localización fija. Para indicar que se ha introducido toda la lista, el usuarioespecifica "Fin" ante la solicitud de entrada del nombre. Una vez que el usuario haterminado de teclear la lista, el programa creará un fichero de salida que semostrará en pantalla o se imprimirá. Por ejemplo:

95-4751232,Juanito 564878,Luisa 123456,Pepe 347698,Antonio 91-3547621,Maria

El código fuente del programa es el siguiente:

import java.io.*;

class Telefonos{

static FileOutputStream fos;

public static final int longLinea = 81;

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

{

byte tfno[ ] = new byte[longLinea];

byte nombre[ ] = new byte[longLinea];

fos = new FileOutputStream( "telefono.dat" );

while( true )

{

System.err.println( "Teclee un nombre ('Fin' termina)" );leeLinea( nombre );

if( "fin".equalsIgnoreCase( new String( nombre,0,0,3 ) ) ) break;

System.err.println( "Teclee el número de teléfono" );

leeLinea( tfno );

for( int i=0; tfno[i] != 0; i++ )

fos.write( tfno[i] );

fos.write( ',' );

for( int i=0; nombre[i] != 0; i++ )

Page 10: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 10/21

fos.write( nombre[i] );

fos.write( 'n' );

}

fos.close();

}

private static void leeLinea( byte linea[ ] ) throws IOException

{

int b = 0;

int i = 0;

while( (i < ( longLinea-1) ) && ( ( b = System.in.read() ) != 'n' ) ) linea[i++] = (byte)b;

linea[i] = (byte)0;

}

}

Streams de salida con buffer

Si se trabaja con gran cantidad de datos, o se escriben muchos elementospequeños, será una buena idea utilizar un stream de salida con buffer. Losstreams con buffer ofrecen los mismos métodos de la clase FileOutputStream,pero toda salida se almacena en un buffer. Cuando se llena el buffer, se envía adisco con una única operación de escritura; o, en caso necesario, se puede enviarel buffer a disco en cualquier momento.

Creación de Streams de salida con buffer

Para crear un stream BufferedOutput, primero se necesita un stream FileOutputnormal; entonces se le añade un buffer al stream:

FileOutputStream miFileStream;

BufferdOutpurStream miBufferStream;

miFileStream = new FileOutputStream( "/tmp/kk" ); //Obtiene un controlador de fichero

miBufferStream = new BufferedOutputStream( miFileStream ); //Encadena un stream de salida con

buffer

Volcado y Cierre de Streams de salida con buffer

Al contrario que los streams FileOutput, cada escritura al buffer no se correspondecon una escritura en disco. A menos que se llene el buffer antes de que termine elprograma, cuando se quiera volcar el buffer explícitamente se debe hacermediante una llamada a:

flush():

miBufferStream.flush( ); //Se fuerza el volcado del buffer a disco

Page 11: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 11/21

miBufferStream.close(); //Cerramos el fichero de datos. Siempre se ha de cerrar primero el fichero

stream de mayor nivel

miFileStream.close();

Streams DataOutput

Java también implementa una clase de salida complementaria a la claseDataInputStream. Con la clase DataOutputStream, se pueden escribir datosbinarios en un fichero.

Apertura y cierre de objetos DataOutputStream

Para abrir y cerrar objetos DataOutputStream, se utilizan los mismos métodos quepara los objetos FileOutputStream:

DataOutputStream miDataStream;

FileOutputStream miFileStream;

BufferedOutputStream miBufferStream;

miFileStream = new FileOutputStream( "/tmp/kk" ); // Obtiene un controlador de fichero

miBufferStream = new BufferedOutputStream( miFileStream ); /* Encadena un stream de salida

con buffer (por eficiencia)*/ 

miDataStream = new DataOutputStream( miBufferStream ); /* Encadena un fichero de salida de

datos*/ 

miBufferStream.write( b ); /* Ahora se pueden utilizar los dos streams de entrada para acceder al

fichero (si se quiere)*/ 

miDataStream.writeInt( i );miDataStream.close( ); /* Cierra el fichero de datos explícitamente. Siempre se cierra primero el

fichero stream de mayor nivel*/ 

miBufferStream.close( );

miFileStream.close( );

Escritura en un objeto DataOutputStream

Cada uno de los métodos write() accesibles por los FileOutputStream también loson a través de los DataOutputStream. También encontrará métodoscomplementarios a los de DataInputStream:

void writeBoolean( boolean b );

void writeByte( int i );

void writeShort( int i );

void writeChar( int i );

Page 12: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 12/21

void writeInt( int i );

void writeFloat( float f );

void writeDouble( double d );

void writeBytes( String s );

void writeChars( string s );

Para las cadenas, se tienen dos posibilidades: bytes y caracteres. Hay querecordar que los bytes son objetos de 8 bits y los caracteres lo son de 16 bits. Sinuestras cadenas utilizan caracteres Unicode, debemos escribirlas conwriteChars( ).

Contabilidad de la salida

Otra función necesaria durante la salida es el método size( ). Este métodosimplemente devuelve el número total de bytes escritos en el fichero. Se puedeutilizar size( ) para ajustar el tamaño de un fichero a múltiplo de cuatro. Porejemplo, de la forma siguiente:

. . . int numBytes = miDataStream.size( ) % 4;

for( int i=0; i < numBytes; i++ ) miDataStream.write( 0 ); . . .

Ficheros de Acceso Aleatorio 

A menudo, no se desea leer un fichero de principio a fin; sino acceder al ficherocomo una base de datos, donde se salta de un registro a otro; cada uno endiferentes partes del fichero. Java proporciona una clase RandomAccessFile paraeste tipo de entrada/salida.

Creación de un Fichero de Acceso Aleatorio 

Hay dos posibilidades para abrir un fichero de acceso aleatorio:

Con el nombre del fichero:

miRAFile = new RandomAccessFile( String nombre,String modo );

Con un objeto File:

miRAFile = new RandomAccessFile( File fichero,String modo );

El argumento modo determina si se tiene acceso de sólo lectura (r) o delectura/escritura (r/w). Por ejemplo, se puede abrir un fichero de una base de datospara actualización:

Page 13: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 13/21

RandomAccessFile miRAFile;

miRAFile = new RandomAccessFile( "/tmp/kk.dbf","rw" );

Acceso a la Información 

Los objetos RandomAccessFile esperan información de lectura/escritura de lamisma manera que los objetos DataInput/DataOutput. Se tiene acceso a todas lasoperaciones read() y write() de las clases DataInputStream y DataOutputStream.

También se tienen muchos métodos para moverse dentro de un fichero:

long getFilePointer();

Devuelve la posición actual del puntero del fichero

void seek( long pos );

Coloca el puntero del fichero en una posición determinada. La posición se da

como un desplazamiento en bytes desde el comienzo del fichero. La posición 0marca el comienzo de ese fichero.

long length();

Devuelve la longitud del fichero. La posición length() marca el final de ese fichero.

Actualización de Información 

Se pueden utilizar ficheros de acceso aleatorio para añadir información a ficherosexistentes:

miRAFile = new RandomAccessFile( "/tmp/kk.log","rw" );miRAFile.seek( miRAFile.length() );

 // Cualquier write( ) que hagamos a partir de este punto del código añadiráinformación al fichero

Ejemplo: Log.java, que añade una cadena a un fichero existente:

import java.io.*; //Cada vez que ejecutemos este programa, se incorporara una nueva línea al

 //fichero de log que se crea la primera vez que se ejecutaclass Log

{

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

{

RandomAccessFile miRAFile;

String s = "Informacion a incorporar\nTutorial de Java\n";

miRAFile = new RandomAccessFile( "/tmp/java.log","rw" );//Abrimos el fichero de acc. Aleatorio

miRAFile.seek( miRAFile.length() ); // Nos vamos al final del fichero

Page 14: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 14/21

miRAFile.writeBytes( s ); // Incorporamos la cadena al fichero

miRAFile.close();// Cerramos el fichero

}

}

Clases para el manejo archivos en C++

Existen tres clases para manejar ficheros: ifstream, ofstream y fstream. La primera

está orientada a ficheros de entrada, la segunda a ficheros de salida, y la tercera

puede manejar cualquiera de los dos tipos o ficheros de entrada y salida.

Clase ifstream: El constructor está sobrecargado para poder crear streams de

varias maneras:

ifstream();

ifstream(const char *name, int mode = ios::in,

int = filebuf::openprot);El primero sólo crea un stream de entrada pero no lo asocia

a ningún fichero. El segundo lo crea, lo asocia al fichero con el nombre "name" y lo

abre.

Los parámetros son: el nombre del fichero, el modo, que para ifstream es ios::in

por defecto. El tercer parámetro se refiere al buffer, y no nos preocupa de

momento.

Clase ofstream: Lo mismo pasa con ofstream, salvo que los valores por defectode los parámetros son diferentes:

ofstream();

ofstream(const char *name, int mode = ios::out,

int = filebuf::openprot);Clase fstream:fstream();

fstream(const char *name, int mode = ios::in,

int = filebuf::openprot);Método open:Todas estas clases disponen además delmétodo "open", para abrir el fichero a lo largo de la ejecución del programa.

void open(const char *name, int mode,

int prot=filebuf::openprot);"name" es el nombre del fichero, mode es el modo en

que se abrirá, puede ser uno o una combinación del tipo enumerado open_mode,

de la clase "ios":

Page 15: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 15/21

enum open_mode { in, out, ate, app, trunc, nocreate,

noreplace, binary };

Cada uno de los valores se pueden combinar usando el operador de bits OR (|), y

significan lo siguiente:in: modo de entrada.

out: modo de salida.

ate: abre el fichero y sitúa el cursor al final.

app: modo append, parecido al anterior, pero las operaciones de escritura siempre

se hacen al final del fichero.

trunc: si se aplica a ficheros de salida, se creará el fichero si no existe

previamente, o se truncará con un tamaño de 0 bytes, si existe.

nocreate: impide crear un fichero si no existe, en ese caso, la función falla.

noreplace: lo ignoro.

binary: abre el fichero en modo binario.

Los tres últimos modos probablemente no son estándar, y es posible que no

existan en muchos compiladores.

Método close:void close();

Sencillamente, cierra el fichero asociado a un stream.

Operador >>: Igual que sucede con el stream estándar cout, el operador de flujo

de salida >> se puede usar con streams de salida cuando trabajemos con texto.

Operador <<: Del mismo modo, al igual que sucede con el stream estándar cin, el

operador de flujo de entrada << se puede usar con streams de entrada cuando

trabajemos con texto.

Método de salida put:ostream& put(char ch);Sirve para cualquier stream de salida, e inserta un carácter en el stream.

Método de entrada get:int get();

istream& get(char*, int len, char = '\n');

istream& get(char&);

Page 16: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 16/21

istream& get(streambuf&, char = '\n');La primera forma no se recomienda y se

considera obsoleta, lee un carácter desde el stream de entrada.

La segunda lee caracteres y los almacena en el buffer indicado en el primer

parámetro hasta que se leen "len" caracteres o hasta que se encuentra el carácter

indicado en el tercer parámetro, que por defecto es el retorno de línea.

La tercera forma extrae un único carácter en la referencia a char proporcionada.

Método de entrada getline:istream& getline(char*, int, char = '\n');

Extrae caracteres hasta que se encuentra el delimitador y los coloca en el buffer,

elimina el delimitador del stream de entrada y no lo añade al buffer.

Método eof:

int eof();

Verifica si se ha alcanzado el final del fichero, devuelve un valor nulo si no es así.

Método clear:void clear(iostate state=0);

Cada vez que se produzca una condición de error en un stream es necesario

eliminarla, ya que en caso contrario ninguna operación que se realice sobre él

tendrá éxisto. Por ejemplo, si llegamos hasta el final de fichero, el stream quedará

en estado "eof" hasta que se elimine explícitamente ese estado. Eso se hace

mediante el método "clear", sin parámetros dejará el estado en 0, es decir, sin

errores.

Los estados posibles se definen en un enumerado:

enum io_state { goodbit, eofbit, failbit, badbit };

goodbit: indica que el estado es correcto.

eofbit: indica que se ha detectado fin de fichero.

failbit: indica que una operación sobre el stream ha fallado.

badbit: se activa si falla una operación de escritura de buffers.

Método bad:int bad();

Devuelve el estado del bit "badbit".

Método fail:int fail();

Devuelve el estado del bit "failbit".

Page 17: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 17/21

Método good:int good();

Devuelve el estado del bit "goodbit".

Ejemplo:

Mostrar dos veces un fichero escrito para C++ usando streams:

 // ejemplo1.cpp: Muestra un fichero dos veces.

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

ifstream fichero("ejemplo1.cpp");

char c;

while(fichero.get(c)) cout.put(c);

fichero.clear(); // (1)fichero.seekg(0);

while(fichero.get(c)) cout.put(c);

fichero.close();

cin.get();

return 0;

}

Método is_open:int is_open();

Devuelve un valor no nulo si el fichero está abierto.

Método flush:ostream& flush();

Realiza las operaciones de escritura pendientes que aún se han realizado sólo en

el buffer.

Métodos relacionados con acceso aleatorio.

Disponemos de otro tipo enumerado en ios para indicar movimientos relativos

dentro de un stream de acceso aleatorio:

enum seek_dir { beg, cur, end};

beg: relativo al principio del fichero.

cur: relativo a la posición actual del cursor dentro del fichero.

end: relativo al final del fichero.

Page 18: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 18/21

Método seekg:

Cambia la posición del cursor en streams de entrada.

istream& seekg(streampos pos);

istream& seekg(streamoff offset, seek_dir dir);

La primera forma es para cambiar la posición de modo absoluto. La segunda para

cambios relativos, en la que se indica el salto en el primer parámetro y el punto de

partida en el segundo, que puede ser cualquiera de los indicados anteriormente:

ios::beg, ios::cur o ios::end.

Método seekp:

Cambia la posición del cursor en streams de salida.

ostream& seekp(streampos pos);

ostream& seekp(streamoff offset, seek_dir);

Lo mismo que seekg, pero aplicado a estream de salida.

Método tellg:streampos tellg();

Devuelve la posición actual del cursor dentro de un stream de entrada.

Método tellp:streampos tellp();

Devuelve la posición actual del cursor dentro de un stream de salida.

Método read:istream& read(char*, int);

Lee el número de caracteres indicado en el segundo parámetro dendro del buffer

suministrado por el primero.

Método gcount:int gcount();

Devuelve el número de caracteres sin formato de la última lectura. Las lecturas sin

formato son las realizadas mediante las funciones get, getline y read.

Método write:ostream& write(const char*, int);

Escribe el número de caracteres indicado en el segundo parámetro desde el buffer

suministrado por el primero.

Page 19: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 19/21

Ejemplo:

Copiar ficheros usando streams.

 // copia.cpp: Copia de ficheros

 // Uso: copia <fichero_origen> <fichero_destino>

#include <iostream>

#include <fstream>

using namespace std;

int main(int argc, char **argv)

{

ifstream entrada;

ofstream salida;

char buffer[2048]; // Buffer de 2 Kbytes

int bytesLeidos;

if(argc != 3)

{

printf("Usar: copia <fichero_origen> <fichero_destino>\n");return 1;

}

 // Abrir el fichero de entrada en lectura y binario

entrada.open(argv[1]);

if(!entrada.good())

{

printf("El fichero %s no existe o no puede ser abierto.\n", argv[1]);

return 1;

}

 // Crear o sobreescribir el fichero de salida en binario

salida.open(argv[2]);

if(!salida.good())

{

printf("El fichero %s no puede ser creado.\n", argv[2]);

entrada.close();

return 1;

}

 // Bucle de copia:

do

{

entrada.read(buffer, 2048);

bytesLeidos = entrada.gcount();

salida.write(buffer, bytesLeidos);}

while(bytesLeidos > 0);

 // Cerrar ficheros:

entrada.close();

salida.close();

return 0;

}

Page 20: Clases as Para El Manejo de Archivos en JAVA

5/11/2018 Clases as Para El Manejo de Archivos en JAVA - slidepdf.com

http://slidepdf.com/reader/full/clases-as-para-el-manejo-de-archivos-en-java 20/21

Conclusión

La utilización de ficheros de datos facilita el intercambio de información entre

programas por lo que puede ser una buena opción para la entrada y salida de la

información en nuestras aplicaciones.