Formas de acceso a un fichero

SECUENCIAL

Para leer y escribir archivos de texto en bloques continuos. El acceso secuencial está diseñado para utilizarlo con archivos de texto sin formato. Se considera que cada carácter de un archivo representa un carácter de texto o una secuencia de formato de texto, como un carácter de nueva línea. Los datos se almacenan como caracteres ANSI.

ALEATORIO

Para leer y escribir archivos de texto o binarios estructurados como registros de longitud fija. Un archivo abierto para acceso aleatorio se considera que está compuesto de un conjunto de registros de longitud idéntica. Los datos se almacenan como información binaria.

¿Cómo leemos un fichero de texto como éste?

1#Pepito Grillo#666888999
2#Michael Corleone#666777888
3#Aitor Tilla#666444222
4#Jhonny Melavo#66611122
...

Fichero, registro y campo

Clases Java de acceso a un fichero

  • Secuencial :
    • FileInputStream / FileOutputStream
    • FileReader / FileWriter
  • Aleatorio o directo :

Crea un programa que guarde un un archivo “enteros.dat” 100 números enteros (4 bytes) aleatorios.

// Instanciar clase Random
Random random = new Random();

// Obtener IntStream. El IntStream tendrá 10 números aleatorios
// entre 1 y 7, excluido el 7. Vaya, la típica tirada de dados del 1 al 6.
IntStream intStream = random.ints(10, 1, 7);

// Iterador para ir obteniendo los números
Iterator iterator = intStream.iterator();

// Sacamos los números aleatorios por pantalla, en un bucle.
while (iterator.hasNext()){
   System.out.println("Random Number "+iterator.next());
}

para recorrer el IntStream:

...
intStream.forEach(value ->
   System.out.println("Random Number "+value)
};
package PckNumerosAleatorios;

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.util.Iterator;
import java.util.Random;
import java.util.stream.IntStream;
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class NumerosAleatorios {
  public static void main (String[] args) {
    
       int nn;
     Random random = new Random();
       IntStream intstream = random.ints(10,0,9999);
       Iterator<Integer> iterator = intstream.iterator();
       
     try(RandomAccessFile fb=new RandomAccessFile("C:\\ADA\\enteros2.dat","rw")){
       while (iterator.hasNext()) {
             nn= iterator.next();   
      	   fb.writeInt(nn);
      	   System.out.print(nn+"-");
         }  
       
     } catch(IOException e) {
       System.out.println(e.getMessage());
     }
  }
}

 

Ejemplo de utilización de RamdomAccessFile: programa Java que pide un número entero por teclado y lo añade al final de un fichero binario enteros.dat que contiene números enteros. El programa utiliza un método mostrarFichero() que se llama dos veces. La primera muestra el contenido del fichero antes de añadir el nuevo número y la segunda llamada muestra el fichero después de añadirlo.

package random1;

import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;

public class Random1 {

    static Scanner sc = new Scanner(System.in);
    static RandomAccessFile fichero = null;

    public static void main(String[] args) {
        int numero;
        try {
            //se abre el fichero para lectura y escritura
            fichero = new RandomAccessFile("c:\\ADA\\enteros.dat", "rw");
            mostrarFichero(); //muestra el contenido original del fichero
            System.out.print("Introduce un número entero para añadir al final del fichero: ");                    
            numero = sc.nextInt(); //se lee el entero a añadir en el fichero
            fichero.seek(fichero.length()); //nos situamos al final del fichero
            fichero.writeInt(numero);       //se escribe el entero
            mostrarFichero();//muestra el contenido del fichero después de añadir el número

        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                if (fichero != null) {
                    fichero.close();
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }

    public static void mostrarFichero() {
        int n;
        try {
            fichero.seek(0); //nos situamos al principio
            while (true) {
                n = fichero.readInt();  //se lee  un entero del fichero                                           
                System.out.println(n);  //se muestra en pantalla
            }
        } catch (EOFException e) {
            System.out.println("Fin de fichero");
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

Mejorando el progrma Java para modificar un entero dentro del fichero enteros.dat con acceso aleatorio. Para ello se pide la posición que ocupa el entero a modificar dentro del fichero, a continuación se lee y muestra el valor actual, se pide el nuevo valor y finalmente se escribe el nuevo valor en la posición indicada, modificando de esta forma el valor antiguo por el nuevo. La posición deberá estar comprendida entre 1 y el número de enteros que contiene el fichero.

La cantidad de enteros que contiene el fichero se calcula asi:

//se asigna a size el tamaño en bytes del fichero
size = fichero.length();
//cada int en Java ocupa 4 bytes. Si dividimos el total de bytes entre 4 obtenemos el número de //enteros que contiene el fichero.
size = size / 4;
package random2;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;

public class Random2{

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        RandomAccessFile fichero = null;
        int pos, numero;
        long size;
        try {
            fichero = new RandomAccessFile("c:\\ADA\\enteros.dat", "rw");                                        

            //calcular cuántos enteros tiene el fichero
            size = fichero.length();
            size = size / 4;
            System.out.println("El fichero tiene " + size + " enteros");

            //Modificar el entero que se encuentra en una posición determinada
            do {
                System.out.println("Introduce una posición (>=1 y <= " + size + "): ");
                pos = sc.nextInt();
            } while (pos < 1 || pos > size);

            pos--;  //la posición 1 realmente es la 0
           
            //nos situamos en la posición (byte de inicio) del entero a modificar
            //en Java un entero ocupa 4 bytes
            fichero.seek(pos*4);

            //leemos y mostramos el valor actual
            System.out.println("Valor actual: " + fichero.readInt());
           
            //pedimos que se introduzca el nuevo valor
            System.out.println("Introduce nuevo valor: ");
            numero = sc.nextInt();

            //nos situamos de nuevo en la posición del entero a modificar
            //esto es necesario porque después de la lectura que hemos realizado para mostrar                     
            //el valor el puntero de lectura/escritura ha avanzado al siguiente entero del fichero.
            //si no hacemos esto escribiremos sobre el siguiente entero
            fichero.seek(pos*4);

            //escribimos el entero
            fichero.writeInt(numero);

        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }finally {
            try {
                if (fichero != null) {
                    fichero.close();
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

 

Actividad 06. Listado de directorios y analisis de ficheros.

Aprovechando alguno de los ejercicios anteriormente realizados, crea un programa que liste los ficheros de un directorio y que marque cada fichero de con un “Ok” cuando la extensión del archivo coincida con el tipo de archivo, con “Err” cuando la extesión no coincida con el tipo de archivo y con “??” cuando no tengamos registrado el tipo de archivo ni su cadena inicial. Además si detectamos que el Archivos es unn directorio deberá comprobar si dicha Directorio está vacio o lleno en cuyo caso deberá marcar con las siglas “LL” o “VA”.

Antes de empezar el ejercicio deberás averiguar con que secuencia de bytes empiezan algunos de los ficheros conocidos que vas a utilizar en elejercicio.

  • .exe:
  • .jpg:
  • etc.