Cliente – Suministrador: solución

Programas completos

Cliente:

import java.io.*;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;

public class Cliente {

    /**
     * @param args Argumentos de la línea de comando
     *             El primer argumento pasado, será la ruta del fichero
     */
    public static void main(String[] args) {

        String nombreFichero;
        File archivo;
        RandomAccessFile raf = null;
        FileLock bloqueo = null;
        int cuenta = 1;
        int valor;
/*
        try{
            //Rediregimos salida y error estándar a un fichero
            PrintStream ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(new File("javalog_cliente.txt"),true)), true);
            System.setOut(ps);
            System.setErr(ps);
        } catch(Exception e){
            System.err.println("Cliente. No he podido redirigir salidas.");
        }
*/

        if (args.length > 0)
            nombreFichero = args[0];
            //Hemos recibido la ruta del fichero en la línea de comandos
        else
            nombreFichero = "/home/usuario/buffer.txt";
        //Fichero que se utilizará por defecto

        //Preparamos el acceso al fichero
        archivo = new File(nombreFichero);
        while (cuenta <= 10) {//leeremos 10 datos
            try {
                raf = new RandomAccessFile(archivo, "rwd"); //Abrimos el fichero
                //***************
                //Sección crítica
                bloqueo = raf.getChannel().lock();
                System.out.println("Cliente: Entra en la sección");
                if (raf.length() > 0) {
                    valor = raf.readInt();
                    System.out.println("Cliente: dato leído " + valor);
                    raf.setLength(0);
                    cuenta ++;
                } else
                    System.out.println("Cliente: no se puede leer");
                bloqueo.release();
                bloqueo = null;
                //Fin sección crítica
                //*******************
                Thread.sleep(1000);//simulamos tiempo de procesamiento del dato
                //cuenta ++;
            } catch (IOException e) {
                System.err.println("Cliente. Error al acceder al fichero.");
                System.err.println(e.toString());
            } catch (OverlappingFileLockException ex) {
                System.err.println("Cliente. Error en el bloqueo del fichero.");
                System.err.println(ex.toString());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (bloqueo != null) bloqueo.release();
                    if (raf != null) raf.close();
                } catch (Exception e2) {
                    System.err.println("Cliente. Error al cerrar el fichero.");
                    System.err.println(e2.toString());
                    System.exit(1);  //Si hay error, finalizamos
                }
            }
        }
    }
}

Suministrador:

import java.io.File;
import java.io.RandomAccessFile;
import java.io.PrintStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileLock;

public class Suministrador {

    /**
     * @param args Argumentos de la línea de comando
     *             El primer argumento pasado, será la ruta del fichero
     */
    public static void main(String[] args) {

        String nombreFichero;
        File archivo;
        RandomAccessFile raf = null;
        FileLock bloqueo = null;
        int i = 1;

      /*
        try{
            //Rediregimos salida y error estándar a un fichero
            PrintStream ps = new PrintStream(
                             new BufferedOutputStream(new FileOutputStream(
                             new File("javalog_suministrador.txt"),true)), true);
            System.setOut(ps);
            System.setErr(ps);
        } catch(Exception e){
            System.err.println("Suministrador. No he podido redirigir salidas.");
        }
*/
        if (args.length > 0)
            nombreFichero = args[0];
            //Hemos recibido la ruta del fichero en la línea de comandos
        else
            nombreFichero = "/home/usuario/buffer.txt";
        //Fichero que se utilizará por defecto

        //Preparamos el acceso al fichero
        archivo = new File(nombreFichero);

        while (i <= 10) {//escribiremos 10 datos
            try {
                raf = new RandomAccessFile(archivo, "rwd"); //Abrimos el fichero
                //***************
                //Sección crítica
                bloqueo = raf.getChannel().lock();
                System.out.println("Suministrador: Entra en la sección");
                if (raf.length() == 0) {
                    raf.writeInt(i);
                    System.out.println("Suministrador: dato escrito " + i);
                    i ++;
                } else
                    System.out.println("Suministrador: no puede escribir");
                System.out.println("Suministrador: Sale en la sección");
                bloqueo.release();
                bloqueo = null;
                //Fin sección crítica
                //*******************
                Thread.sleep(500); //Simulamos tiempo de creación del dato
            } catch (Exception e) {
                System.err.println("Suministrador. Error al acceder al fichero.");
                System.err.println(e.toString());
            } finally {
                try {
                    if (bloqueo != null) bloqueo.release();
                    if (raf != null) raf.close();
                } catch (Exception e2) {
                    System.err.println("Suministrador. Error al cerrar el fichero.");
                    System.err.println(e2.toString());
                    System.exit(1);  //Si hay error, finalizamos
                }
            }
        }
    }
}

Abrir en una consola el cliente:

javac Cliente.java
java Cliente numeros.txt

y en otra el suministrador:

javac Suministrador.java
java Suministrador numeros.txt

 

Deja una respuesta