ARCHIVOS

APARTADOS

La clase File
Archivos tipo texto
Archivos binarios
Acceso aleatorio

La clase File

La clase file contiene una gran colección de métodos que pueden servir de gran ayuda:

Obtener información del archivo
String getName()
String getPath()

String getAbsolutePath()
String getParent()
boolean renameTo( File nuevoNombre )
long lastModified()
long length()
 
Propiedades del archivo
boolean exists()
boolean canWrite()
boolean canRead()
boolean isFile()
boolean isDirectory()
boolean isAbsolute()
 
Acciones
boolean mkdir()
String[] list()

 




 

 

 

 

 

 

 

 

 

 

¿Cómo crear un objeto de la clase File?. Existen dos alternativas para la creación de instancias de la clase File:

1) Se crea el objeto directamente:

File fichero;

fichero = new File("c:\fich.txt")

2) Se crea un objeto que haga referencia a un directorio y posteriormente se crea otro objeto a partir de dicho directorio:

File directorio = new File("c:\datos");

File fichero = new File(directorio, "fich.txt");

A continuación se va a ver un ejemplo sencillo de uso:

//Descripción: Ejemplo sencillo de archivos
//Autor: Daniel Leyva Cortés
//Contacto: transistor47@hotmail.com

import java.io.*;

class operacionesArchivo
{

  //"throws IOException", así no habrá que usar la sentencia try.

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

    //Se recoge el nombre del archivo, el cual será el único parámetro pasado en la llamada
File fichero = new File( args[0] );


//Se visualizan las propiedades del archivo
System.out.println( "Ruta: "+fichero.getPath() );

if( fichero.exists() )
{

 

      System.out.println( "Fichero " + fichero.getName() +
" existe, y su longitud es " + fichero.length() + " bytes");

if (fichero.canRead())
System.out.println("El fichero puede leerse");

if (fichero.canWrite())
System.out.println("El fichero puede escribirse");

    }
else
      System.out.println( "El fichero " + args[0] + ",no existe" );
    }
  }    
} //IMPORTANTE. Para ejecutarlo habrá que indicar el nombre del archivo, ejemplo:
//java operacionesArchivo fichero.txt

Archivos tipo texto

Para archivos de tipo texto se usan las clases "FileInputStream" y "FileOutputStream". Para lectura y escritura se usarán los métodos "read" y "write" respectivamente:

(dos ejemplos extraídos de la URL http://www.javacoffeebreak.com/java103/java103.html)

LECTURA DE ARCHIVO

import java.io.*;

class FileInputDemo
{
public static void main(String args[])
{

// args.length equivalente al "argc" del lenguaje C
if (args.length == 1)
{

try
{
//Abre el archivo indicado como primer parámetro

FileInputStream fstream = new FileInputStream(args[0]);

//Se convierte el input stream en DataInputStream

DataInputStream in = new DataInputStream(fstream);

//Lee "líneas" mientras quede contenido

while (in.available() !=0)
{

//Imprime la línea rescatada del archivo en pantalla
System.out.println (in.readLine());


}

in.close();

}
catch (Exception e)
{


System.err.println("Error en archivo de entrada");


}


}
else

System.out.println("Parámetros incorrectos");


}

}

ESCRITURA DE ARCHIVO

import java.io.*;

 

class FileOutputDemo
{

public static void main(String args[])
{

FileOutputStream out; // Declara archivo salida
PrintStream p; // Declara un objeto "PrintStream"

try
{


// Crea un fichero de salida llamado miArchivo.txt

out = new FileOutputStream("miArchivo.txt");

// Enlaza "PrintStream" al archivo de saloda
p = new PrintStream( out );

p.println ("Este texto se escribe en un archivo de salida");

p.close();

}
catch (Exception e)
{

System.err.println ("Error escribiendo en el archivo");

}

}
}

EJERCICIO: Realizar el comando "RENOMBRA <original> <destino>" que renombre un archivo de tipo texto utilizando el método de copia (es decir, se crea un nuevo archivo con el nombre al que se quiere renombrar y una vez copiado el contenido se destruye el original)

Archivos binarios

En los archivos binarios habrá que usar aparte de las clases ya vistas en el apartado anterior "FileInputStream" y "FileOutputStream", las clases "DataInputStream" y "DataOutputStream".

Para lectura del contenido se dispone de los siguientes métodos, prácticamente uno para cada tipo de dato:

byte readByte()
int readUnsignedByte()
short readShort()
int readUnsignedShort()
char readChar()
int readInt()
long readLong()
float readFloat()
double readDouble()
String readLine()

Para escritura se dispone de los siguientes métodos, prácticamente uno para cada tipo de dato:

void writeBoolean( boolean b );
void writeByte( int i );
void writeShort( int i );
void writeChar( int i );
void writeInt( int i );
void writeFloat( float f );
void writeDouble( double d );
void writeBytes( String s );
void writeChars( string s );

A continuación se va a ver un ejemplo de uso:

//Descripción: Archivos de entrada/salida binarios
//Autor: Daniel Leyva Cortés
//Contacto: transistor47@hotmail.com

import java.io.*;

class estructuraDatos
{

  String nombre;
int edad;
long dni;
class binarioEntradaSalida
{
//Inicialmente estaba declarada de la siguiente forma:
//final int LONGITUD_LINEA=1024; pero se le ha tenido
//que añadir "static" pues sino aparecía el siguiente error:
//non-static variable LONGITUD_LINEA cannot be referenced from a static context
// byte linea[] = new byte[LONGITUD_LINEA];

static final int LONGITUD_LINEA=80;
static final String NOMBRE_ARCHIVO="prueba.dat";


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

  FileInputStream ficheroTextoEntrada;
FileOutputStream ficheroTextoSalida;
DataInputStream ficheroBinarioEntrada;
DataOutputStream ficheroBinarioSalida;
cEntrada entrada = new cEntrada();
String lineaLeida;
estructuraDatos registro = new estructuraDatos();

//ESCRITURA EN ARCHIVO BINARIO
//Para abrir un archivo binario hay que realizar dos pasos:

ficheroTextoSalida = new FileOutputStream(NOMBRE_ARCHIVO);
ficheroBinarioSalida = new DataOutputStream(ficheroTextoSalida);

System.out.print("Nombre:");
lineaLeida = entrada.leeCadena();
while(lineaLeida.compareTo("")!=0)
{
    registro.nombre = new String(lineaLeida);
System.out.print("DNI:");
registro.dni = Long.parseLong(entrada.leeCadena());
System.out.print("Edad:");
registro.edad = Integer.parseInt(entrada.leeCadena());

//Ahora se escribe el contenido del registro
//MUY IMPORTANTE: Para escribir una cadena se usará el método "writeUTF"
//el cual escribirá los caracteres usando la codificación UTF-8 modificada
//totalmente independiente de la máquina

ficheroBinarioSalida.writeUTF(registro.nombre);
ficheroBinarioSalida.writeInt(registro.edad);
ficheroBinarioSalida.writeLong(registro.dni);
System.out.print("Nombre:");
lineaLeida = entrada.leeCadena();
  }

//El cierre de un archivo binario se realiza en los dos siguientes pasos:

ficheroBinarioSalida.close();
ficheroTextoSalida.close();
//FIN ESCRITURA ARCHIVO BINARIO
//LECTURA DEL ARCHIVO BINARIO


ficheroTextoEntrada = new FileInputStream(NOMBRE_ARCHIVO);
ficheroBinarioEntrada = new DataInputStream(ficheroTextoEntrada);

System.out.println("Contenido del archivo " + NOMBRE_ARCHIVO);

while (ficheroBinarioEntrada.available()!=0)

{
    System.out.print("Nombre:");
System.out.println(ficheroBinarioEntrada.readUTF());
System.out.print("DNI:");
System.out.println(ficheroBinarioEntrada.readInt());
System.out.print("Edad:");
System.out.println(ficheroBinarioEntrada.readLong());
 

}

ficheroBinarioEntrada.close();
ficheroTextoEntrada.close();

}

}

class cEntrada
{
InputStreamReader entrada;
BufferedReader bufferEntrada;

public cEntrada()
{

  entrada = new InputStreamReader(System.in);
bufferEntrada = new BufferedReader(entrada);
}
public String leeCadena()
{
  String cadena = new String("");
try
{
    cadena = bufferEntrada.readLine();
  }
catch(java.io.IOException excepcionProducida )
{
    System.err.println("Problema al intertar leer de la entrada estándar...");
  }
return new String(cadena);

}

}

EJERCICIO: Crear un programa en Java que genere el archivo binario "notas.dat". Este archivo contendrá las notas de 10 alumnos (de cada alumno se almacenará un número identificativo del 1 al 10, su nombre y apellidos) en las asignaturas de REDES y PROGRAMACIÓN. El programa tendrá que visualizar el contenido del archivo generado

Acceso aleatorio

Código ejemplo: cada vez que se ejecuta el programa se incorpora una nueva entrada en un archivo log. La primera vez que se ejecuta se crea el archivo log:

(Código fuente extraído de la URL: http://www.ulpgc.es/otros/tutoriales/java/Cap8/fich_al.html#accesoaleatorio)

import java.io.*;

class Log {

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


RandomAccessFile miRAFile;
String s = "Cadena a insertar en el archivo\n";

// Se abre el fichero de acceso aleatorio
miRAFile = new RandomAccessFile( "/tmp/java.log","rw" );
// En la siguiente sentencia se posiciona al final del archivo
miRAFile.seek( miRAFile.length() );
// Se escribe una cadena en el archivo
miRAFile.writeBytes( s );
// Cierre del archivo
miRAFile.close();

 

}

}

En el siguiente ejemplo se envía como argumento el nombre de un fichero (si no existe se crea). El usuario escribirá texto hasta que introduzca una línea en blanco. Cuando se produzca la línea en blanco se muestra en pantalla la información que se ha ido almacenando en el archivo:

(Ejemplo extraído de la URL http://metodosestadisticos.unizar.es/asignaturas/10234/mateo/FRAF2.java)

import java.io.*;


class ficherosTextoAleatorio{

public static void main(String args[]){

File f;

RandomAccessFile fichero;

int leidos;

if(args.length==0 || args.length >1){


System.out.println("Error, introducir como argumento el nombre del archivo");
System.exit(1);

}

f= new File(args[0]);

String cadena = new String(" ");

try{

//Se crea archivo
fichero = new RandomAccessFile(f,"rw");

//Se reserva un espacio de memoria
byte buffer[] = new byte[250];

while(cadena.length()>1)

{

leidos=System.in.read(buffer); //Se lee de la entrada estándar
cadena = new String(buffer,0,leidos); //Se copia en una cadena los caracteres leídos

//Se presenta en pantalla información de la cadena leída
System.out.print(""+leidos+":"+cadena.length()+": "+cadena);

//Si es una cadena vacía se escribe la cadena en el archivo
if(cadena.length()>1)

fichero.writeChars(cadena);

}


fichero.close();


}
catch(IOException e){


System.out.println("Error en el proceso");
System.exit(1);


}


System.out.println("Se ha cerrado el archivo");

try{

//Apertura archivo
fichero = new RandomAccessFile(f,"r");
int i=1;
while(true){

//Lectura de una línea del archivo
cadena=fichero.readLine();

//Si la cadena está vacía quiere decir que el archivo

//no tiene más contenido
if(cadena==null)

throw new EOFException();

//Se visualiza la cadena leída

System.out.println(""+i+": "+cadena);
i++;

}


}
catch(EOFException e)

{

System.out.println("Se ha llegado al final del archivo");

}
catch(IOException e){

System.out.println("Error en proceso");

}

}

 

}

EJERCICIO: Modificar el programa del ejercicio anterior para que acceda de forma directa a los datos de un alumno dado su número identificativo

Volver al sumario