SlideShare une entreprise Scribd logo
1  sur  17
Télécharger pour lire hors ligne
Classe Documento

import java.util.*;
import java.io.RandomAccessFile;
import java.io.IOException;


/**
*
* @author Ignazio Altomare, Sergio Centrone, Fabio Gadaleta
* Classe per la gestione del documento
*
*/


public class Documento{


/**
*
* Costruisce una classe Documento in grado di gestire un archivio
*
* @param nnprogressivo Indica il numero progressivo del documento preso in input
* @param ntitolo Indica il titolo del documento preso in input
* @param nautore Indica l'autore del documento preso in input
* @param nargomento Indica l'argomento del documento preso in input
* @param ndatapubblicazione Indica la data di pubblicazione del documento preso in input
* @param nnomedelfile Indica il nome del file del documento preso in input
*/


      public   Documento(int   nnprogressivo,   String   ntitolo,   String   nautore,   String
nargomento, String ndatapubblicazione, String nnomedelfile)
      {
          nprogressivo=nnprogressivo; // Assegnazione numero progressivo
          titolo=ntitolo; // Assegnazione titolo
          argomento=nargomento; // Assegnazione argomento
          autore=nautore; // Assegnazione autore
          datapubblicazione=ndatapubblicazione; // Assegnazione data pubblicazione
          nomedelfile=nnomedelfile; // Assegnazione nome del file


      }


/**
*
* Costruttore che permette di costruire un tipo documento senza associarlo ad un file
*
*/


                                                                                            1
public Documento()
      {
          file=null; // Non viene associato nessun file
      }


/**
*
* Apre il file dei documenti
*
*     * @param filename Il nome del file che contiene l'archivio di documenti
*     * @param mode Per specificare la modalit di apertura del file
*/


      public void open(String filename, boolean mode) throws IOException
      {
          if(file!=null)
             file.close(); // Se il file     gia aperto viene chiuso
          if (mode)
             file=new RandomAccessFile(filename,"rw"); // Viene aperto un file ad accesso
casuale in modalit lettura e scrittura
          else
             file=new RandomAccessFile(filename,"r");// Viene aperto un file ad accesso
casuale in modalit lettura
      }


/**
*
* Restituisce il numero di documenti presenti nell'archivio
*
* @return Il numero di documenti presenti nell'archivio
*/


      public int size() throws IOException
      {
          return(int)(file.length()/RECORD_SIZE); // Calcolo degli elementi presenti nel
file
      }


/**
*
* Chiude il file dei dati
*
*/


      public void close()throws IOException
      {

                                                                                       2
if(file!=null) file.close(); // Chiusura del file ad accesso casuale
           file=null; // Il file non punta a nessun file ad accesso casuale
      }


/**
*
* Effettua l'inserimento di un documento all'interno dell'archivio
*
* @param dimensione Indica il numero progressivo ultimo del file archivio
*/


public void inserimento(int dimensione)throws IOException
{
      boolean confrontogiorni;
      boolean confrontomesi;
      boolean confrontoanni;
      Scanner in=new Scanner(System.in);
      Documento appoggio=new Documento(); // Oggetto di appoggio per l'inserimeno dei dati
dal documento
      appoggio.nprogressivo      =dimensione;   //    Assegnazione    del   numero        progressivo
nell'oggetto di appoggio


      do
      {
           System.out.print("DIMMI IL TITOLO: ");
           appoggio.titolo=in.nextLine(); // Inserimento del titolo nell'oggetto di appoggio
      }
      while((appoggio.titolo.length()==0)||(appoggio.titolo.length()>=25));          //    Controllo
sul titolo


      do
      {
           System.out.print("DIMMI L'AUTORE: ");
           appoggio.autore=in.nextLine(); // Inserimento autore nell'oggetto di appoggio
      }
      while((appoggio.autore.length()==0)||(appoggio.autore.length()>=25));          //    Controllo
sull autore


      do
      {
           System.out.print("DIMMI L'ARGOMENTO: ");
           appoggio.argomento=in.nextLine();    //   Inserimento     argomento   nell'oggetto     di
appoggio
      }
      while((appoggio.argomento.length()==0)||(appoggio.argomento.length()>=25));                 //
Controllo sull argomento



                                                                                                   3
do
      {
           System.out.print("DIMMI LA DATA DI PUBBLICAZIONE(GG/MM/AAAA): ");
           appoggio.datapubblicazione=in.nextLine(); // Inserimento data di pubblicazione
           String ggs=appoggio.datapubblicazione.substring(0, 2); // Estrazione del giorno
           String mms=appoggio.datapubblicazione.substring(3, 5); // Estrazione de mese
           String aaaas=appoggio.datapubblicazione.substring(6, 10); // Estrazione dell'anno
           int gg=(int)Integer.parseInt(ggs); // Trasformazione della stringa in intero
           int mm=(int)Integer.parseInt(mms); // Trasformazione della stringa in intero
           int aaaa=(int)Integer.parseInt(aaaas); // Trasformazione della stringa in intero
           confrontogiorni=((gg>31)||(gg<1)); // Controllo sui giorni
           confrontomesi=((mm>12)||(mm<1)); // Controllo sui mesi
           confrontoanni=((aaaa>2007)||(aaaa<1800)); // Controllo sugli anni
      }
      while    ((confrontogiorni||(confrontomesi)||confrontoanni));         //     Controllo     data
pubblicazione


      do
      {
           System.out.print("DAMMI IL NOME DEL FILE=");
           appoggio.nomedelfile=in.nextLine(); // Inserimento del nome del file nell'oggetto
di appoggio
      }


      while((appoggio.nomedelfile.length()==0)||(appoggio.nomedelfile.length()>=25));


      file.seek(appoggio.nprogressivo*RECORD_SIZE); // Posizionamento del cursore nel file
ad accesso casuale
      file.writeInt(appoggio.nprogressivo); // Scrittura del     numero progressivo
      writefixedString(appoggio.titolo,25); // Scrittura del titolo come stringa di 25
caratteri
      writefixedString(appoggio.autore,25); // Scrittura del autore come stringa di 25
caratteri
      writefixedString(appoggio.argomento,25); // Scrittura del argomento come stringa di
25 caratteri
      writefixedString(appoggio.datapubblicazione,25);      //    Scrittura      della    data    di
pubblicazione come stringa di 25 caratteri
      writefixedString(appoggio.nomedelfile,25);   //     Scrittura   del   nome    del   file   come
stringa di 25 caratteri
}


/**
*
* Effettua una elencazione di tutti i documenti presenti nel file in base ad un criterio
di scelta (in base all'autore o l'argomento) se ci sono campi con quei valori di ricerca
*
* @param dimensione Indica il numero massimo di documnenti presenti nel file

                                                                                                   4
* @param parametro Contiene l'informazione del campo da ricercare nell'archivio
*/


public void elencazione(int dimensione,String parametro)throws IOException
{
     Documento   appoggio=new   Documento();   //   Oggetto    di   appoggio     per    inserire     i    dati
contenuti nel file
     boolean test=false; // Variabile booleana che ci permette di definire se                            stato
provato il documento nel file
     for(int i=0;i<dimensione;i++) // Ciclo di scansione del file ad accesso casuale
     {
         file.seek(i*RECORD_SIZE); // Posizionamento del puntatore all' interno del file
ad accesso casuale
         appoggio.nprogressivo=file.readInt(); // Lettura del numero progressivo
         appoggio.titolo=readfixedString(25); // Lettura del titolo come stringa di 25
caratteri
         appoggio.autore=readfixedString(25); // Lettura del autore come stringa di 25
caratteri
         appoggio.argomento=readfixedString(25); // Lettura del argomento come stringa di
25 caratteri
         appoggio.datapubblicazione=readfixedString(25);            //   Lettura        della      data      di
pubblicazione come stringa di 25 caratteri
         appoggio.nomedelfile=readfixedString(25);       //    Lettura    del    nome    del      file    come
stringa di 25 caratteri
         if   (appoggio.argomento.equals(parametro))      //    Confronto      tra     l'argomento       e   il
parametro dato in input dall' utente
         {
              test=true; // Viene posto a vero perch      stato trovato il documento richiesto
              System.out.println("NUMERO       PROGRESSIVO:         "+appoggio.nprogressivo);                //
Visualizzo all'utente il numero progressivo
              System.out.println("TITOLO: "+appoggio.titolo); // Visualizzo all'utente il
titolo
              System.out.println("AUTORE:      "+appoggio.autore);       //     Visualizzo        all'utente
l'autore
              System.out.println("ARGOMENTO:        "+appoggio.argomento);              //        Visualizzo
all'utente l'argomento
              System.out.println("DATA     PUBBLICAZIONE:      "+appoggio.datapubblicazione);                //
Visualizzo all'utente la data di pubblicazione
              System.out.println("NOME   DEL    FILE:   "+appoggio.nomedelfile);             //   Visualizzo
all'utente il nome del file
              System.out.println("");
         }
     }


     if(!test) // Nel caso in cui non      presente un documento con campo argomento uguale a
quello del campo preso in input andiamo a scandire l'archivo per quel che riguarda i
campi autore

                                                                                                             5
{
               for(int i=0;i<dimensione;i++)
               {
                   file.seek(i*RECORD_SIZE);
                   appoggio.nprogressivo=file.readInt();
                   appoggio.titolo=readfixedString(25);
                   appoggio.autore=readfixedString(25);
                   appoggio.argomento=readfixedString(25);
                   appoggio.datapubblicazione=readfixedString(25);
                   appoggio.nomedelfile=readfixedString(25);
                   if (appoggio.autore.equals(parametro)) // Controllo del campo autore
                   {
                       test=true;
                       System.out.println("NUMERO PROGRESSIVO: "+appoggio.nprogressivo);
                       System.out.println("TITOLO: "+appoggio.titolo);
                       System.out.println("ARGOMENTO: "+appoggio.argomento);
                       System.out.println("DATA                                PUBBLICAZIONE:
"+appoggio.datapubblicazione);
                       System.out.println("NOME DEL FILE: "+appoggio.nomedelfile);
                       System.out.println("AUTORE: "+appoggio.autore);
                       System.out.println("");
                   }
               }
          if (!test) // Controllo se   stato trovato il documento oppure no
          {
               System.out.println("IL DOCUMENTO NON E STATO TROVATO!");
          }
      }
}


/**
*
* Metodo per scrivere stringhe in un file ad accesso casuale
*
* @param s Indica la stringa da scrivere nel file
* @param size Indica la grandezza della stringa
* @throws IOException Lancia un'eccezione in caso di mancanza del file
*/


public void writefixedString(String s,int size) throws IOException
{
      int i;
      for(i=0;i<size;i++) // Ciclo per la scansione della stringa di 25 caratteri
      {
          char ch=0; // Carattere della string
          if (i<s.length()) ch=s.charAt(i); // Assegnazione del carattere della stringa in
posizione i alla variabile ch

                                                                                           6
file.writeChar(ch); // Scrittura del carattere nell file ad accesso casuale
      }
}


/**
*
* Legge le stringhe da un file ad accesso casuale
*
* @param size Indica la dimensione del campo stringa
* @return Restituisce la stringa letta
* @throws IOException Lancia un'eccezione in caso di mancanza del file
*/


public String readfixedString(int size) throws IOException
{
      String b=""; // Stringa che conterr la concatenazione tra i vari caretteri
      int i=0;
      boolean more=true; // Variabile booleana che ci permette di capire se sono finiti i
caratteri e ci sono spazi vuoti nel file
      while(more&&i<size) // Ciclo di scansione dei caratteri
      {
          char ch=file.readChar(); // Lettura dei caratteri all'interno del file
          i++;
          if(ch==0)more=false; // Se il carattere e il vuoto allora viene posta a falso la
variabile booleana
               else b=b+ch; // Viene concatenato il carattere letto dal file nella stringa
      }
      file.skipBytes(2*(size-i)); // Vengono saltati gli spazi vuoti rimanenti del campo
      return b; // Fa ritornare la stringa letta dal file
}


/**
*
* Effettua la ricerca del documento secondo il numero progressivo come parametro
*
* @param dimensione Indica il numero di documenti presenti nel archivio
* @param parametro Indica il numero progressivo da ricercare
* @throws IOException Lancia un'eccezione in caso di mancanza del file
*/


public void ricerca(int dimensione, int parametro)throws IOException
{
      String   scelta;   //   Variabile   che   ci   permette   di   capire   cosa   dobbiamo   farne   del
documento trovato, se eliminarlo o modificarlo
      Scanner in=new Scanner(System.in);
      Documento appoggio=new Documento(); // Documento di appoggio che ci aiuta nella
scansione dell' archivio

                                                                                                         7
if (parametro<dimensione) // Controllo per capire se il numero progressivo e conforme
al numero di documenti presenti nell'archivio, cio se non super la sua dimensione
      {
          file.seek(parametro*RECORD_SIZE);     //    Posizioniamo     il   carrello    sul    record    da
leggere
          appoggio.nprogressivo=file.readInt(); // Leggiamo il campo numero progressivo
          appoggio.titolo=readfixedString(25); // Leggiamo il campo titolo
          appoggio.autore=readfixedString(25); // Leggiamo il campo autore
          appoggio.argomento=readfixedString(25); // Leggiamo il campo argomento
          appoggio.datapubblicazione=readfixedString(25);         //    Leggiamo       il     campo    data
pubblicazione
          appoggio.nomedelfile=readfixedString(25); // Leggiamo il nome del file
          System.out.println("NUMERO PROGRESSIVO: "+appoggio.nprogressivo);
          System.out.println("TITOLO: "+appoggio.titolo);
          System.out.println("ARGOMENTO: "+appoggio.argomento);
          System.out.println("DATA PUBBLICAZIONE: "+appoggio.datapubblicazione);
          System.out.println("NOME DEL FILE: "+appoggio.nomedelfile);
          System.out.println("AUTORE: "+appoggio.autore);
          System.out.println("");
          System.out.println("MODIFICA O ELIMINAZIONE (M/E) ");
          scelta=in.nextLine(); // Prendiamo in input la scelta che deve fare l'utente
             if (scelta.equalsIgnoreCase("M")) // Nel caso in cui ci chieda di modificarlo
deve pigiare M e nel caso di eliminazione E
                    modifica(parametro); // Attiva la modifica del documento
          else if (scelta.equalsIgnoreCase("E"))
                    eliminazione(parametro); // Attiva l'eliminazione del documento
          else
                System.out.println("SCELTA NON VALIDA");
      }
      else
          System.out.println("NON ESISTE UN DOCUMENTO CON QUESTO NUMERO PROGRESSIVO!");
}


/**
*
* Effettuiamo la modifica di un elemento sapendo il suo numero progressivo
*
* @param parametro Indica il numero progressivo dell'elemento da modificare
* @throws IOException Lancia un'eccezione in caso di mancanza del file
*/


public void modifica(int parametro)throws IOException
{
      inserimento(parametro);    //   Andiamo   a    modificare   l'elemento     secondo       il     numero
progressivo utilizzando il metodo di inserimento
}



                                                                                                          8
/**
*
    * Effettua l' eliminazione di un documento appartenente all' archivio sapendo il suo
numero progressivo
*
* @param parametro Indica il documento con numero progressivo da eliminare
* @throws IOException Lancia un'eccezione in caso di mancanza del file
*/


public void eliminazione(int parametro)throws IOException
{
      appoggio=new RandomAccessFile("appoggio.bin","rw"); // Per effettuare l' eliminazione
abbiamo bisogno di un file di appoggio
      int contatore;
      for(contatore=0;contatore<parametro;contatore++) // Effettuiamo al scansione completa
di tutto l'archivio fino al documento da eliminare
      {
          file.seek(contatore*RECORD_SIZE);   //   Spostiamo   il    carrello   relativo     al     file
principale
          appoggio.seek(contatore*RECORD_SIZE); // Spostiamo il carrello relativo al file
di appoggio
          appoggio.writeInt(file.readInt()); // Scrittura numero progressivo
          writefixedStringappoggio(readfixedString(25),25); // Scrittura del titolo come
stringa di 25 caratteri
          writefixedStringappoggio(readfixedString(25),25); // Scrittura del autore come
stringa di 25 caratteri
          writefixedStringappoggio(readfixedString(25),25); // Scrittura del argomento come
stringa di 25 caratteri
          writefixedStringappoggio(readfixedString(25),25);     //    Scrittura   della      data     di
pubblicazione come stringa di 25 caratteri
          writefixedStringappoggio(readfixedString(25),25); // Scrittura del nome del file
come stringa di 25 caratteri
      }
      contatore=contatore+1; // Incrementiamo il contatore
      if (!(contatore==(size()))) // Verifichiamo che il contatore non abbia superato la
dimensione dell'archivio
      {
          for(;contatore<size();contatore++)//copiamo gli ultimi elementi dell' archivio
principale nell archivio appoggio a partire dall'elemento succesivo da eliminare
          {
              file.seek(contatore*RECORD_SIZE);
              appoggio.seek((contatore-1)*RECORD_SIZE);
              appoggio.writeInt(file.readInt()-1); // Scrittura numero progressivo
              writefixedStringappoggio(readfixedString(25),25);       //   Scrittura   del     titolo
come stringa di 25 caratteri
              writefixedStringappoggio(readfixedString(25),25);       //   Scrittura   del     autore
come stringa di 25 caratteri

                                                                                                      9
writefixedStringappoggio(readfixedString(25),25); // Scrittura del argomento
come stringa di 25 caratteri
               writefixedStringappoggio(readfixedString(25),25); // Scrittura della data di
pubblicazione come stringa di 25 caratteri
               writefixedStringappoggio(readfixedString(25),25); // Scrittura del nome del
file come stringa di 25 caratteri
          }
      }
      file.close();
      file=new RandomAccessFile("archivio.bin","rw");
      for(int i=0;i<size()-1;i++) // Con questo ciclo andiamo a ricopiare il file appoggio
nel file principale con l'avvenuta eliminazione del documento
      {
          file.seek(i*RECORD_SIZE);
          appoggio.seek(i*RECORD_SIZE);
          file.writeInt(appoggio.readInt()); // Scrittura numero progressivo
          writefixedString(readfixedStringappoggio(25),25); // Scrittura del titolo come
stringa di 25 caratteri
          writefixedString(readfixedStringappoggio(25),25); // Scrittura del autore come
stringa di 25 caratteri
          writefixedString(readfixedStringappoggio(25),25); // Scrittura del argomento come
stringa di 25 caratteri
          writefixedString(readfixedStringappoggio(25),25);   //     Scrittura   della   data    di
pubblicazione come stringa di 25 caratteri
          writefixedString(readfixedStringappoggio(25),25); // Scrittura del nome del file
come stringa di 25 caratteri
      }


      file.setLength(file.length()-RECORD_SIZE);   //   Diminuiamo    la   dimensione    del    file
principale perche abbiamo eliminato un elemento
      appoggio.close();
}


/**
*
* Effettua la scrittura di una string nel file di appoggio
*
* @param s Indica la stringa da scrivere nel file di appoggio
* @param size Indica la dimensione della stringa
* @throws IOException Lancia un'eccezione in caso di mancanza del file
*/


public void writefixedStringappoggio(String s,int size) throws IOException
{
      int i;
      for(i=0;i<size;i++) // Ciclo per la scansione della stringa di 25 caratteri
      {

                                                                                                 10
char ch=0; // Carattere della string
          if (i<s.length()) ch=s.charAt(i); // Assegnazione del carattere della stringa in
posizione i alla variabile ch
          appoggio.writeChar(ch); // Scrittura del carattere nell file ad accesso casuale
      }
}


/**
*
* Effettua la lettura di una stringa dal file di appoggio
*
* @param size Indica la dimensione della stringa
* @return La stringa letta dal file ad accesso casuale
* @throws IOException Lancia un'eccezione in caso di mancanza del file
*/


public String readfixedStringappoggio(int size) throws IOException
{
      String b=""; // Stringa che conterr la concatenazione tra i vari caretteri
      int i=0;
      boolean more=true; // Variabile booleana che ci permette di capire se sono finiti i
caratteri e ci sono spazi vuoti nel file
      while(more&&i<size) // Ciclo di scansione dei caratteri
      {
          char ch=appoggio.readChar(); // Lettura dei caratteri all' interno del file
          i++;
          if(ch==0)
              more=false; // Se il carattere e il vuoto allora viene posta a falso la
variabile booleana
          else
              b=b+ch; // Viene concatenato il carattere letto dal file nella stringa
      }


      appoggio.skipBytes(2*(size-i)); // Vengono saltati gli spazi vuoti rimanenti del
campo
      return b; // Fa ritornare la stringa letta dal file
}


/**
*
    * Effettua la ricerca nell'archivio con in input un campo stringa che potrebbe essere o
l'autore o il titolo
*
* @param dimensione Indica il numero di documenti presenti nell'archivio
* @param parametro Indica il campo stringa da ricercare nell'archivio
* @throws IOException Lancia un'eccezione in caso di mancanza del file
*/

                                                                                            11
public void ricerca(int dimensione, String parametro)throws IOException
{
    Documento    appoggio=new   Documento();   //   Oggetto   di   appoggio     per     inserire     i        dati
contenuti nel file
    boolean test=false; // Variabile booleana che ci permette di definire se                              stato
trovato il documento nel file
    String scelta;
    Scanner in=new Scanner(System.in);
    int i=0;
    while((i<dimensione)&&(!test)) // Ciclo di scansione del file ad accesso casuale
    {
        file.seek(i*RECORD_SIZE); // Posizionamento del puntatore all' interno del file ad
accesso casuale
         appoggio.nprogressivo=file.readInt(); // Lettura del numero progressivo
         appoggio.titolo=readfixedString(25); // Lettura del titolo come stringa di 25
caratteri
         appoggio.autore=readfixedString(25); // Lettura del autore come stringa di 25
caratteri
         appoggio.argomento=readfixedString(25); // Lettura del argomento come stringa di
25 caratteri
         appoggio.datapubblicazione=readfixedString(25);           //   Lettura       della        data         di
pubblicazione come stringa di 25 caratteri
         appoggio.nomedelfile=readfixedString(25);      //    Lettura     del    nome      del    file        come
stringa di 25 caratteri
         if    (appoggio.titolo.equals(parametro))     //     Confronto    tra     l'argomento            e     il
parametro dato in input dall' utente
         {
              test=true;
              System.out.println("NUMERO PROGRESSIVO:"+appoggio.nprogressivo);
              System.out.println("TITOLO:"+appoggio.titolo);
              System.out.println("ARGOMENTO:"+appoggio.argomento);
              System.out.println("DATA PUBBLICAZIONE:"+appoggio.datapubblicazione);
              System.out.println("NOME DEL FILE:"+appoggio.nomedelfile);
              System.out.println("AUTORE:"+appoggio.autore);
              System.out.println("");
              System.out.println("MODIFICARE O ELIMINARE?(M/E) ");
              scelta=in.nextLine();
              if (scelta.equalsIgnoreCase("M")) // Nel caso in cui ci chieda di modificarlo
deve pigiare M e nel caso di eliminazione E
                                        modifica(appoggio.nprogressivo);              //         Attiva         la
modifica del documento
                  else if (scelta.equalsIgnoreCase("E"))
                                        eliminazione(appoggio.nprogressivo);                 //       Attiva
l'eliminazione del documento
                                else
                                        System.out.println("SCELTA NON VALIDA");

                                                                                                               12
}
    }
    if(!test)
    {
        i=0;
        while((i<dimensione)&&(!test))
        {
            file.seek(i*RECORD_SIZE);
            appoggio.nprogressivo=file.readInt();
            appoggio.titolo=readfixedString(25);
            appoggio.autore=readfixedString(25);
            appoggio.argomento=readfixedString(25);
            appoggio.datapubblicazione=readfixedString(25);
            appoggio.nomedelfile=readfixedString(25);
            if (appoggio.autore.equals(parametro))
            {
                test=true;
                System.out.println("NUMERO PROGRESSIVO: "+appoggio.nprogressivo);
                System.out.println("TITOLO: "+appoggio.titolo);
                System.out.println("ARGOMENTO: "+appoggio.argomento);
                System.out.println("DATA PUBBLICAZIONE: "+appoggio.datapubblicazione);
                System.out.println("NOME DEL FILE: "+appoggio.nomedelfile);
                System.out.println("AUTORE: "+appoggio.autore);
                System.out.println("");
                System.out.println("MODIFICARE O ELIMINARE?(M/E) ");
                scelta=in.nextLine();
                if   (scelta.equalsIgnoreCase("M"))   //   Nel   caso   in   cui   ci    chieda   di
modificarlo deve pigiare M e nel caso di eliminazione E
                                      modifica(appoggio.nprogressivo);        //        Attiva    la
modifica del documento
                else if (scelta.equalsIgnoreCase("E"))
                                      eliminazione(appoggio.nprogressivo);          //       Attiva
l'eliminazione del documento
                               else
                                      System.out.println("SCELTA NON VALIDA");
            }
        }


        if (!test) // Controllo se    stato trovato il documento oppure no
        {
            System.out.println("IL DOCUMENTO NON E STATO TROVATO!!!");
        }
    }
}


    private RandomAccessFile appoggio;
    private String titolo;

                                                                                                  13
private String autore;
    private String nomedelfile;
    private int nprogressivo;
    private String datapubblicazione;
    private String argomento;
    private RandomAccessFile file;
    public static final int INT_SIZE=4;
    public static final int STRING_SIZE=50;
    public static final int RECORD_SIZE=(5*STRING_SIZE)+INT_SIZE;


}




                                                                    14
Classe DocGest


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


/**
*
* @author Ignazio Altomare, Sergio Centrone, Fabio Gadaleta
* Classe principale dell'archivio
*
*/


public class DocGest
{
       public static void main(String[]args) throws IOException
       {
             Scanner in=new Scanner(System.in);
             Documento data =new Documento();
             boolean vuoto;
             boolean apertura;
             int scelta=0;
             int dimensione;
             String campo;
             while(scelta<4)
             {
                    vuoto=false;    //   Variabile   che   ci   permette   di   capire   se   ci   sono
elementi nel file
                    apertura=false; // Specifica il tipo di apertura del file
                    try
                    {
                             data.open("archivio.bin",apertura); // Apre il file in lettura
                             dimensione=data.size(); // Determina il numero di elementi nel
file
                             if (dimensione==0) // Se il numero di elementi e pari a 0
permetti solo l'inserimento
                             {
                                   vuoto=true;
                                   System.out.println("1 - INSERIMENTO ");
                                   System.out.println();
                                   System.out.println();
                                   System.out.println("4 - USCITA ");
                             }
                             else // Altrimenti permetti altre operazioni
                                   if ((dimensione!=0)&&(dimensione<50))
                                   {


                                                                                                    15
System.out.println("1 - INSERIMENTO ");
                                        System.out.println("2 - ELENCAZIONE ");
                                        System.out.println("3    -   MODIFICA    O   ELIMINAZIONE
");
                                        System.out.println("4 - USCITA ");
                                 }
                                 else
                                 {
                                        System.out.println("1 - ");
                                        System.out.println("2 - ELENCAZIONE ");
                                        System.out.println("3    -   MODIFICA    O   ELIMINAZIONE
");
                                        System.out.println("4 - USCITA ");
                                 }
                                 System.out.print("SCELTA= ");
                                 scelta=in.nextInt();
                                 data.close(); // Chiudo il file aperto in lettura per
vedere se ci sono o non ci sono elementi
                                 if (scelta==1)
                                 {
                                        apertura=true;
                                        data.open("archivio.bin",apertura); // Apriamo il
file in scrittura per inserire un nuovo documento
                                        data.inserimento(dimensione);      //   Inserimento        di
un nuovo documento
                                        data.close();    //   Chiudiamo   il    file      aperto   in
scrittura
                                 }
                                 else if ((scelta==2)&&(vuoto==false))
                                 {
                                        apertura=false;
                                        data.open("archivio.bin",apertura); // Apriamo il
file in lettura per l'elencazione
                                        in.nextLine();
                                        System.out.println("DAMMI         IL         CAMPO         DA
TROVARE(ARGOMENTO/AUTORE): ");
                                        campo=in.nextLine(); // Prendi in input il campo
da ricercare
                                        data.elencazione(dimensione,campo);          //    Effettua
l'elencazione secondo il campo ricevuto in input
                                        data.close();    //   Chiudiamo   il    file      aperto   in
lettura
                                        in.nextInt(); // Aspetta che l'utente riesca a
visualizzare i dati e poi prosegue
                                 }
                                 else if ((scelta==3)&&(vuoto==false))
                                 {

                                                                                                   16
apertura=true;
                                       data.open("archivio.bin",   apertura);//Apriamo   il
file in scrittura per la mododifica o l'eliminazione
                                       in.nextLine();
                                       System.out.println("DAMMI       IL     CAMPO      DA
TROVARE(TITOLO/AUTORE/NUMERO PROGRESSIVO): ");
                                       if(in.hasNextInt())
                                              data.ricerca(dimensione,in.nextInt());     //
Prendi in input il campo da ricercare se   un intero
                                       else
                                              data.ricerca(dimensione,in.nextLine());    //
Prendiamo in input il campo da ricercare se e una stringa
                                              data.close(); // Chiudiamo il file aperto
in lettura
                                       }
                                }
                                catch(IOException exception)//eccezione che gestisce la
mancata presenza del file all' avvio del programma
                          {
                                apertura=true;
                                data.open("archivio.bin", apertura);
                                System.out.println("RIAVVIARE   PROGRAMMA   PER   EFFETTUARE
OPERAZIONI!");
                          }


                          finally//chiusura del file
                          {
                                       data.close();
                          }
                   }
             }
}




                                                                                         17

Contenu connexe

Similaire à Programmazione Doc Gest, Codifica

Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)FLT.lab
 
MS_corso base iOS iPhone_partII
MS_corso base iOS iPhone_partIIMS_corso base iOS iPhone_partII
MS_corso base iOS iPhone_partIIMobileSchool
 
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsioneAlgoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsioneSergio Porcu
 
Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Ivan Gualandri
 
Sistemi operativi Fabiano Dalla Piazza
Sistemi operativi  Fabiano Dalla PiazzaSistemi operativi  Fabiano Dalla Piazza
Sistemi operativi Fabiano Dalla PiazzaFabiano Dalla Piazza
 

Similaire à Programmazione Doc Gest, Codifica (10)

Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)
 
MS_corso base iOS iPhone_partII
MS_corso base iOS iPhone_partIIMS_corso base iOS iPhone_partII
MS_corso base iOS iPhone_partII
 
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsioneAlgoritmi e Programmazione Avanzata - Ordinamento e ricorsione
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
 
Programming iOS lezione 3
Programming iOS lezione 3Programming iOS lezione 3
Programming iOS lezione 3
 
Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4
 
Java lezione 6
Java lezione 6Java lezione 6
Java lezione 6
 
Py a4 python-file
Py a4 python-filePy a4 python-file
Py a4 python-file
 
Sistemi operativi Fabiano Dalla Piazza
Sistemi operativi  Fabiano Dalla PiazzaSistemi operativi  Fabiano Dalla Piazza
Sistemi operativi Fabiano Dalla Piazza
 
11 I File
11   I File11   I File
11 I File
 
Java lezione 19
Java lezione 19Java lezione 19
Java lezione 19
 

Plus de Alartzero

Valutazione Dellinterazione
Valutazione DellinterazioneValutazione Dellinterazione
Valutazione DellinterazioneAlartzero
 
Analisi Dei Requisiti E Progettazione Dellinterazione
Analisi Dei Requisiti E Progettazione DellinterazioneAnalisi Dei Requisiti E Progettazione Dellinterazione
Analisi Dei Requisiti E Progettazione DellinterazioneAlartzero
 
Programmazione per il web - WebWord
Programmazione per il web - WebWordProgrammazione per il web - WebWord
Programmazione per il web - WebWordAlartzero
 
Economia Dellinnovazione Caso Di Studio Nintendo
Economia Dellinnovazione   Caso Di Studio   NintendoEconomia Dellinnovazione   Caso Di Studio   Nintendo
Economia Dellinnovazione Caso Di Studio NintendoAlartzero
 
Algoritmi E Strutture Dati Alberi N Ari
Algoritmi E Strutture Dati   Alberi N AriAlgoritmi E Strutture Dati   Alberi N Ari
Algoritmi E Strutture Dati Alberi N AriAlartzero
 
Algoritmi E Strutture Dati Liste
Algoritmi E Strutture Dati   ListeAlgoritmi E Strutture Dati   Liste
Algoritmi E Strutture Dati ListeAlartzero
 
Virginio Desktop Analisi
Virginio Desktop   AnalisiVirginio Desktop   Analisi
Virginio Desktop AnalisiAlartzero
 
Algoritmi E Strutture Dati Code
Algoritmi E Strutture Dati   CodeAlgoritmi E Strutture Dati   Code
Algoritmi E Strutture Dati CodeAlartzero
 
Algoritmi E Strutture Dati Pile
Algoritmi E Strutture Dati   PileAlgoritmi E Strutture Dati   Pile
Algoritmi E Strutture Dati PileAlartzero
 

Plus de Alartzero (9)

Valutazione Dellinterazione
Valutazione DellinterazioneValutazione Dellinterazione
Valutazione Dellinterazione
 
Analisi Dei Requisiti E Progettazione Dellinterazione
Analisi Dei Requisiti E Progettazione DellinterazioneAnalisi Dei Requisiti E Progettazione Dellinterazione
Analisi Dei Requisiti E Progettazione Dellinterazione
 
Programmazione per il web - WebWord
Programmazione per il web - WebWordProgrammazione per il web - WebWord
Programmazione per il web - WebWord
 
Economia Dellinnovazione Caso Di Studio Nintendo
Economia Dellinnovazione   Caso Di Studio   NintendoEconomia Dellinnovazione   Caso Di Studio   Nintendo
Economia Dellinnovazione Caso Di Studio Nintendo
 
Algoritmi E Strutture Dati Alberi N Ari
Algoritmi E Strutture Dati   Alberi N AriAlgoritmi E Strutture Dati   Alberi N Ari
Algoritmi E Strutture Dati Alberi N Ari
 
Algoritmi E Strutture Dati Liste
Algoritmi E Strutture Dati   ListeAlgoritmi E Strutture Dati   Liste
Algoritmi E Strutture Dati Liste
 
Virginio Desktop Analisi
Virginio Desktop   AnalisiVirginio Desktop   Analisi
Virginio Desktop Analisi
 
Algoritmi E Strutture Dati Code
Algoritmi E Strutture Dati   CodeAlgoritmi E Strutture Dati   Code
Algoritmi E Strutture Dati Code
 
Algoritmi E Strutture Dati Pile
Algoritmi E Strutture Dati   PileAlgoritmi E Strutture Dati   Pile
Algoritmi E Strutture Dati Pile
 

Programmazione Doc Gest, Codifica

  • 1. Classe Documento import java.util.*; import java.io.RandomAccessFile; import java.io.IOException; /** * * @author Ignazio Altomare, Sergio Centrone, Fabio Gadaleta * Classe per la gestione del documento * */ public class Documento{ /** * * Costruisce una classe Documento in grado di gestire un archivio * * @param nnprogressivo Indica il numero progressivo del documento preso in input * @param ntitolo Indica il titolo del documento preso in input * @param nautore Indica l'autore del documento preso in input * @param nargomento Indica l'argomento del documento preso in input * @param ndatapubblicazione Indica la data di pubblicazione del documento preso in input * @param nnomedelfile Indica il nome del file del documento preso in input */ public Documento(int nnprogressivo, String ntitolo, String nautore, String nargomento, String ndatapubblicazione, String nnomedelfile) { nprogressivo=nnprogressivo; // Assegnazione numero progressivo titolo=ntitolo; // Assegnazione titolo argomento=nargomento; // Assegnazione argomento autore=nautore; // Assegnazione autore datapubblicazione=ndatapubblicazione; // Assegnazione data pubblicazione nomedelfile=nnomedelfile; // Assegnazione nome del file } /** * * Costruttore che permette di costruire un tipo documento senza associarlo ad un file * */ 1
  • 2. public Documento() { file=null; // Non viene associato nessun file } /** * * Apre il file dei documenti * * * @param filename Il nome del file che contiene l'archivio di documenti * * @param mode Per specificare la modalit di apertura del file */ public void open(String filename, boolean mode) throws IOException { if(file!=null) file.close(); // Se il file gia aperto viene chiuso if (mode) file=new RandomAccessFile(filename,"rw"); // Viene aperto un file ad accesso casuale in modalit lettura e scrittura else file=new RandomAccessFile(filename,"r");// Viene aperto un file ad accesso casuale in modalit lettura } /** * * Restituisce il numero di documenti presenti nell'archivio * * @return Il numero di documenti presenti nell'archivio */ public int size() throws IOException { return(int)(file.length()/RECORD_SIZE); // Calcolo degli elementi presenti nel file } /** * * Chiude il file dei dati * */ public void close()throws IOException { 2
  • 3. if(file!=null) file.close(); // Chiusura del file ad accesso casuale file=null; // Il file non punta a nessun file ad accesso casuale } /** * * Effettua l'inserimento di un documento all'interno dell'archivio * * @param dimensione Indica il numero progressivo ultimo del file archivio */ public void inserimento(int dimensione)throws IOException { boolean confrontogiorni; boolean confrontomesi; boolean confrontoanni; Scanner in=new Scanner(System.in); Documento appoggio=new Documento(); // Oggetto di appoggio per l'inserimeno dei dati dal documento appoggio.nprogressivo =dimensione; // Assegnazione del numero progressivo nell'oggetto di appoggio do { System.out.print("DIMMI IL TITOLO: "); appoggio.titolo=in.nextLine(); // Inserimento del titolo nell'oggetto di appoggio } while((appoggio.titolo.length()==0)||(appoggio.titolo.length()>=25)); // Controllo sul titolo do { System.out.print("DIMMI L'AUTORE: "); appoggio.autore=in.nextLine(); // Inserimento autore nell'oggetto di appoggio } while((appoggio.autore.length()==0)||(appoggio.autore.length()>=25)); // Controllo sull autore do { System.out.print("DIMMI L'ARGOMENTO: "); appoggio.argomento=in.nextLine(); // Inserimento argomento nell'oggetto di appoggio } while((appoggio.argomento.length()==0)||(appoggio.argomento.length()>=25)); // Controllo sull argomento 3
  • 4. do { System.out.print("DIMMI LA DATA DI PUBBLICAZIONE(GG/MM/AAAA): "); appoggio.datapubblicazione=in.nextLine(); // Inserimento data di pubblicazione String ggs=appoggio.datapubblicazione.substring(0, 2); // Estrazione del giorno String mms=appoggio.datapubblicazione.substring(3, 5); // Estrazione de mese String aaaas=appoggio.datapubblicazione.substring(6, 10); // Estrazione dell'anno int gg=(int)Integer.parseInt(ggs); // Trasformazione della stringa in intero int mm=(int)Integer.parseInt(mms); // Trasformazione della stringa in intero int aaaa=(int)Integer.parseInt(aaaas); // Trasformazione della stringa in intero confrontogiorni=((gg>31)||(gg<1)); // Controllo sui giorni confrontomesi=((mm>12)||(mm<1)); // Controllo sui mesi confrontoanni=((aaaa>2007)||(aaaa<1800)); // Controllo sugli anni } while ((confrontogiorni||(confrontomesi)||confrontoanni)); // Controllo data pubblicazione do { System.out.print("DAMMI IL NOME DEL FILE="); appoggio.nomedelfile=in.nextLine(); // Inserimento del nome del file nell'oggetto di appoggio } while((appoggio.nomedelfile.length()==0)||(appoggio.nomedelfile.length()>=25)); file.seek(appoggio.nprogressivo*RECORD_SIZE); // Posizionamento del cursore nel file ad accesso casuale file.writeInt(appoggio.nprogressivo); // Scrittura del numero progressivo writefixedString(appoggio.titolo,25); // Scrittura del titolo come stringa di 25 caratteri writefixedString(appoggio.autore,25); // Scrittura del autore come stringa di 25 caratteri writefixedString(appoggio.argomento,25); // Scrittura del argomento come stringa di 25 caratteri writefixedString(appoggio.datapubblicazione,25); // Scrittura della data di pubblicazione come stringa di 25 caratteri writefixedString(appoggio.nomedelfile,25); // Scrittura del nome del file come stringa di 25 caratteri } /** * * Effettua una elencazione di tutti i documenti presenti nel file in base ad un criterio di scelta (in base all'autore o l'argomento) se ci sono campi con quei valori di ricerca * * @param dimensione Indica il numero massimo di documnenti presenti nel file 4
  • 5. * @param parametro Contiene l'informazione del campo da ricercare nell'archivio */ public void elencazione(int dimensione,String parametro)throws IOException { Documento appoggio=new Documento(); // Oggetto di appoggio per inserire i dati contenuti nel file boolean test=false; // Variabile booleana che ci permette di definire se stato provato il documento nel file for(int i=0;i<dimensione;i++) // Ciclo di scansione del file ad accesso casuale { file.seek(i*RECORD_SIZE); // Posizionamento del puntatore all' interno del file ad accesso casuale appoggio.nprogressivo=file.readInt(); // Lettura del numero progressivo appoggio.titolo=readfixedString(25); // Lettura del titolo come stringa di 25 caratteri appoggio.autore=readfixedString(25); // Lettura del autore come stringa di 25 caratteri appoggio.argomento=readfixedString(25); // Lettura del argomento come stringa di 25 caratteri appoggio.datapubblicazione=readfixedString(25); // Lettura della data di pubblicazione come stringa di 25 caratteri appoggio.nomedelfile=readfixedString(25); // Lettura del nome del file come stringa di 25 caratteri if (appoggio.argomento.equals(parametro)) // Confronto tra l'argomento e il parametro dato in input dall' utente { test=true; // Viene posto a vero perch stato trovato il documento richiesto System.out.println("NUMERO PROGRESSIVO: "+appoggio.nprogressivo); // Visualizzo all'utente il numero progressivo System.out.println("TITOLO: "+appoggio.titolo); // Visualizzo all'utente il titolo System.out.println("AUTORE: "+appoggio.autore); // Visualizzo all'utente l'autore System.out.println("ARGOMENTO: "+appoggio.argomento); // Visualizzo all'utente l'argomento System.out.println("DATA PUBBLICAZIONE: "+appoggio.datapubblicazione); // Visualizzo all'utente la data di pubblicazione System.out.println("NOME DEL FILE: "+appoggio.nomedelfile); // Visualizzo all'utente il nome del file System.out.println(""); } } if(!test) // Nel caso in cui non presente un documento con campo argomento uguale a quello del campo preso in input andiamo a scandire l'archivo per quel che riguarda i campi autore 5
  • 6. { for(int i=0;i<dimensione;i++) { file.seek(i*RECORD_SIZE); appoggio.nprogressivo=file.readInt(); appoggio.titolo=readfixedString(25); appoggio.autore=readfixedString(25); appoggio.argomento=readfixedString(25); appoggio.datapubblicazione=readfixedString(25); appoggio.nomedelfile=readfixedString(25); if (appoggio.autore.equals(parametro)) // Controllo del campo autore { test=true; System.out.println("NUMERO PROGRESSIVO: "+appoggio.nprogressivo); System.out.println("TITOLO: "+appoggio.titolo); System.out.println("ARGOMENTO: "+appoggio.argomento); System.out.println("DATA PUBBLICAZIONE: "+appoggio.datapubblicazione); System.out.println("NOME DEL FILE: "+appoggio.nomedelfile); System.out.println("AUTORE: "+appoggio.autore); System.out.println(""); } } if (!test) // Controllo se stato trovato il documento oppure no { System.out.println("IL DOCUMENTO NON E STATO TROVATO!"); } } } /** * * Metodo per scrivere stringhe in un file ad accesso casuale * * @param s Indica la stringa da scrivere nel file * @param size Indica la grandezza della stringa * @throws IOException Lancia un'eccezione in caso di mancanza del file */ public void writefixedString(String s,int size) throws IOException { int i; for(i=0;i<size;i++) // Ciclo per la scansione della stringa di 25 caratteri { char ch=0; // Carattere della string if (i<s.length()) ch=s.charAt(i); // Assegnazione del carattere della stringa in posizione i alla variabile ch 6
  • 7. file.writeChar(ch); // Scrittura del carattere nell file ad accesso casuale } } /** * * Legge le stringhe da un file ad accesso casuale * * @param size Indica la dimensione del campo stringa * @return Restituisce la stringa letta * @throws IOException Lancia un'eccezione in caso di mancanza del file */ public String readfixedString(int size) throws IOException { String b=""; // Stringa che conterr la concatenazione tra i vari caretteri int i=0; boolean more=true; // Variabile booleana che ci permette di capire se sono finiti i caratteri e ci sono spazi vuoti nel file while(more&&i<size) // Ciclo di scansione dei caratteri { char ch=file.readChar(); // Lettura dei caratteri all'interno del file i++; if(ch==0)more=false; // Se il carattere e il vuoto allora viene posta a falso la variabile booleana else b=b+ch; // Viene concatenato il carattere letto dal file nella stringa } file.skipBytes(2*(size-i)); // Vengono saltati gli spazi vuoti rimanenti del campo return b; // Fa ritornare la stringa letta dal file } /** * * Effettua la ricerca del documento secondo il numero progressivo come parametro * * @param dimensione Indica il numero di documenti presenti nel archivio * @param parametro Indica il numero progressivo da ricercare * @throws IOException Lancia un'eccezione in caso di mancanza del file */ public void ricerca(int dimensione, int parametro)throws IOException { String scelta; // Variabile che ci permette di capire cosa dobbiamo farne del documento trovato, se eliminarlo o modificarlo Scanner in=new Scanner(System.in); Documento appoggio=new Documento(); // Documento di appoggio che ci aiuta nella scansione dell' archivio 7
  • 8. if (parametro<dimensione) // Controllo per capire se il numero progressivo e conforme al numero di documenti presenti nell'archivio, cio se non super la sua dimensione { file.seek(parametro*RECORD_SIZE); // Posizioniamo il carrello sul record da leggere appoggio.nprogressivo=file.readInt(); // Leggiamo il campo numero progressivo appoggio.titolo=readfixedString(25); // Leggiamo il campo titolo appoggio.autore=readfixedString(25); // Leggiamo il campo autore appoggio.argomento=readfixedString(25); // Leggiamo il campo argomento appoggio.datapubblicazione=readfixedString(25); // Leggiamo il campo data pubblicazione appoggio.nomedelfile=readfixedString(25); // Leggiamo il nome del file System.out.println("NUMERO PROGRESSIVO: "+appoggio.nprogressivo); System.out.println("TITOLO: "+appoggio.titolo); System.out.println("ARGOMENTO: "+appoggio.argomento); System.out.println("DATA PUBBLICAZIONE: "+appoggio.datapubblicazione); System.out.println("NOME DEL FILE: "+appoggio.nomedelfile); System.out.println("AUTORE: "+appoggio.autore); System.out.println(""); System.out.println("MODIFICA O ELIMINAZIONE (M/E) "); scelta=in.nextLine(); // Prendiamo in input la scelta che deve fare l'utente if (scelta.equalsIgnoreCase("M")) // Nel caso in cui ci chieda di modificarlo deve pigiare M e nel caso di eliminazione E modifica(parametro); // Attiva la modifica del documento else if (scelta.equalsIgnoreCase("E")) eliminazione(parametro); // Attiva l'eliminazione del documento else System.out.println("SCELTA NON VALIDA"); } else System.out.println("NON ESISTE UN DOCUMENTO CON QUESTO NUMERO PROGRESSIVO!"); } /** * * Effettuiamo la modifica di un elemento sapendo il suo numero progressivo * * @param parametro Indica il numero progressivo dell'elemento da modificare * @throws IOException Lancia un'eccezione in caso di mancanza del file */ public void modifica(int parametro)throws IOException { inserimento(parametro); // Andiamo a modificare l'elemento secondo il numero progressivo utilizzando il metodo di inserimento } 8
  • 9. /** * * Effettua l' eliminazione di un documento appartenente all' archivio sapendo il suo numero progressivo * * @param parametro Indica il documento con numero progressivo da eliminare * @throws IOException Lancia un'eccezione in caso di mancanza del file */ public void eliminazione(int parametro)throws IOException { appoggio=new RandomAccessFile("appoggio.bin","rw"); // Per effettuare l' eliminazione abbiamo bisogno di un file di appoggio int contatore; for(contatore=0;contatore<parametro;contatore++) // Effettuiamo al scansione completa di tutto l'archivio fino al documento da eliminare { file.seek(contatore*RECORD_SIZE); // Spostiamo il carrello relativo al file principale appoggio.seek(contatore*RECORD_SIZE); // Spostiamo il carrello relativo al file di appoggio appoggio.writeInt(file.readInt()); // Scrittura numero progressivo writefixedStringappoggio(readfixedString(25),25); // Scrittura del titolo come stringa di 25 caratteri writefixedStringappoggio(readfixedString(25),25); // Scrittura del autore come stringa di 25 caratteri writefixedStringappoggio(readfixedString(25),25); // Scrittura del argomento come stringa di 25 caratteri writefixedStringappoggio(readfixedString(25),25); // Scrittura della data di pubblicazione come stringa di 25 caratteri writefixedStringappoggio(readfixedString(25),25); // Scrittura del nome del file come stringa di 25 caratteri } contatore=contatore+1; // Incrementiamo il contatore if (!(contatore==(size()))) // Verifichiamo che il contatore non abbia superato la dimensione dell'archivio { for(;contatore<size();contatore++)//copiamo gli ultimi elementi dell' archivio principale nell archivio appoggio a partire dall'elemento succesivo da eliminare { file.seek(contatore*RECORD_SIZE); appoggio.seek((contatore-1)*RECORD_SIZE); appoggio.writeInt(file.readInt()-1); // Scrittura numero progressivo writefixedStringappoggio(readfixedString(25),25); // Scrittura del titolo come stringa di 25 caratteri writefixedStringappoggio(readfixedString(25),25); // Scrittura del autore come stringa di 25 caratteri 9
  • 10. writefixedStringappoggio(readfixedString(25),25); // Scrittura del argomento come stringa di 25 caratteri writefixedStringappoggio(readfixedString(25),25); // Scrittura della data di pubblicazione come stringa di 25 caratteri writefixedStringappoggio(readfixedString(25),25); // Scrittura del nome del file come stringa di 25 caratteri } } file.close(); file=new RandomAccessFile("archivio.bin","rw"); for(int i=0;i<size()-1;i++) // Con questo ciclo andiamo a ricopiare il file appoggio nel file principale con l'avvenuta eliminazione del documento { file.seek(i*RECORD_SIZE); appoggio.seek(i*RECORD_SIZE); file.writeInt(appoggio.readInt()); // Scrittura numero progressivo writefixedString(readfixedStringappoggio(25),25); // Scrittura del titolo come stringa di 25 caratteri writefixedString(readfixedStringappoggio(25),25); // Scrittura del autore come stringa di 25 caratteri writefixedString(readfixedStringappoggio(25),25); // Scrittura del argomento come stringa di 25 caratteri writefixedString(readfixedStringappoggio(25),25); // Scrittura della data di pubblicazione come stringa di 25 caratteri writefixedString(readfixedStringappoggio(25),25); // Scrittura del nome del file come stringa di 25 caratteri } file.setLength(file.length()-RECORD_SIZE); // Diminuiamo la dimensione del file principale perche abbiamo eliminato un elemento appoggio.close(); } /** * * Effettua la scrittura di una string nel file di appoggio * * @param s Indica la stringa da scrivere nel file di appoggio * @param size Indica la dimensione della stringa * @throws IOException Lancia un'eccezione in caso di mancanza del file */ public void writefixedStringappoggio(String s,int size) throws IOException { int i; for(i=0;i<size;i++) // Ciclo per la scansione della stringa di 25 caratteri { 10
  • 11. char ch=0; // Carattere della string if (i<s.length()) ch=s.charAt(i); // Assegnazione del carattere della stringa in posizione i alla variabile ch appoggio.writeChar(ch); // Scrittura del carattere nell file ad accesso casuale } } /** * * Effettua la lettura di una stringa dal file di appoggio * * @param size Indica la dimensione della stringa * @return La stringa letta dal file ad accesso casuale * @throws IOException Lancia un'eccezione in caso di mancanza del file */ public String readfixedStringappoggio(int size) throws IOException { String b=""; // Stringa che conterr la concatenazione tra i vari caretteri int i=0; boolean more=true; // Variabile booleana che ci permette di capire se sono finiti i caratteri e ci sono spazi vuoti nel file while(more&&i<size) // Ciclo di scansione dei caratteri { char ch=appoggio.readChar(); // Lettura dei caratteri all' interno del file i++; if(ch==0) more=false; // Se il carattere e il vuoto allora viene posta a falso la variabile booleana else b=b+ch; // Viene concatenato il carattere letto dal file nella stringa } appoggio.skipBytes(2*(size-i)); // Vengono saltati gli spazi vuoti rimanenti del campo return b; // Fa ritornare la stringa letta dal file } /** * * Effettua la ricerca nell'archivio con in input un campo stringa che potrebbe essere o l'autore o il titolo * * @param dimensione Indica il numero di documenti presenti nell'archivio * @param parametro Indica il campo stringa da ricercare nell'archivio * @throws IOException Lancia un'eccezione in caso di mancanza del file */ 11
  • 12. public void ricerca(int dimensione, String parametro)throws IOException { Documento appoggio=new Documento(); // Oggetto di appoggio per inserire i dati contenuti nel file boolean test=false; // Variabile booleana che ci permette di definire se stato trovato il documento nel file String scelta; Scanner in=new Scanner(System.in); int i=0; while((i<dimensione)&&(!test)) // Ciclo di scansione del file ad accesso casuale { file.seek(i*RECORD_SIZE); // Posizionamento del puntatore all' interno del file ad accesso casuale appoggio.nprogressivo=file.readInt(); // Lettura del numero progressivo appoggio.titolo=readfixedString(25); // Lettura del titolo come stringa di 25 caratteri appoggio.autore=readfixedString(25); // Lettura del autore come stringa di 25 caratteri appoggio.argomento=readfixedString(25); // Lettura del argomento come stringa di 25 caratteri appoggio.datapubblicazione=readfixedString(25); // Lettura della data di pubblicazione come stringa di 25 caratteri appoggio.nomedelfile=readfixedString(25); // Lettura del nome del file come stringa di 25 caratteri if (appoggio.titolo.equals(parametro)) // Confronto tra l'argomento e il parametro dato in input dall' utente { test=true; System.out.println("NUMERO PROGRESSIVO:"+appoggio.nprogressivo); System.out.println("TITOLO:"+appoggio.titolo); System.out.println("ARGOMENTO:"+appoggio.argomento); System.out.println("DATA PUBBLICAZIONE:"+appoggio.datapubblicazione); System.out.println("NOME DEL FILE:"+appoggio.nomedelfile); System.out.println("AUTORE:"+appoggio.autore); System.out.println(""); System.out.println("MODIFICARE O ELIMINARE?(M/E) "); scelta=in.nextLine(); if (scelta.equalsIgnoreCase("M")) // Nel caso in cui ci chieda di modificarlo deve pigiare M e nel caso di eliminazione E modifica(appoggio.nprogressivo); // Attiva la modifica del documento else if (scelta.equalsIgnoreCase("E")) eliminazione(appoggio.nprogressivo); // Attiva l'eliminazione del documento else System.out.println("SCELTA NON VALIDA"); 12
  • 13. } } if(!test) { i=0; while((i<dimensione)&&(!test)) { file.seek(i*RECORD_SIZE); appoggio.nprogressivo=file.readInt(); appoggio.titolo=readfixedString(25); appoggio.autore=readfixedString(25); appoggio.argomento=readfixedString(25); appoggio.datapubblicazione=readfixedString(25); appoggio.nomedelfile=readfixedString(25); if (appoggio.autore.equals(parametro)) { test=true; System.out.println("NUMERO PROGRESSIVO: "+appoggio.nprogressivo); System.out.println("TITOLO: "+appoggio.titolo); System.out.println("ARGOMENTO: "+appoggio.argomento); System.out.println("DATA PUBBLICAZIONE: "+appoggio.datapubblicazione); System.out.println("NOME DEL FILE: "+appoggio.nomedelfile); System.out.println("AUTORE: "+appoggio.autore); System.out.println(""); System.out.println("MODIFICARE O ELIMINARE?(M/E) "); scelta=in.nextLine(); if (scelta.equalsIgnoreCase("M")) // Nel caso in cui ci chieda di modificarlo deve pigiare M e nel caso di eliminazione E modifica(appoggio.nprogressivo); // Attiva la modifica del documento else if (scelta.equalsIgnoreCase("E")) eliminazione(appoggio.nprogressivo); // Attiva l'eliminazione del documento else System.out.println("SCELTA NON VALIDA"); } } if (!test) // Controllo se stato trovato il documento oppure no { System.out.println("IL DOCUMENTO NON E STATO TROVATO!!!"); } } } private RandomAccessFile appoggio; private String titolo; 13
  • 14. private String autore; private String nomedelfile; private int nprogressivo; private String datapubblicazione; private String argomento; private RandomAccessFile file; public static final int INT_SIZE=4; public static final int STRING_SIZE=50; public static final int RECORD_SIZE=(5*STRING_SIZE)+INT_SIZE; } 14
  • 15. Classe DocGest import java.io.IOException; import java.util.Scanner; /** * * @author Ignazio Altomare, Sergio Centrone, Fabio Gadaleta * Classe principale dell'archivio * */ public class DocGest { public static void main(String[]args) throws IOException { Scanner in=new Scanner(System.in); Documento data =new Documento(); boolean vuoto; boolean apertura; int scelta=0; int dimensione; String campo; while(scelta<4) { vuoto=false; // Variabile che ci permette di capire se ci sono elementi nel file apertura=false; // Specifica il tipo di apertura del file try { data.open("archivio.bin",apertura); // Apre il file in lettura dimensione=data.size(); // Determina il numero di elementi nel file if (dimensione==0) // Se il numero di elementi e pari a 0 permetti solo l'inserimento { vuoto=true; System.out.println("1 - INSERIMENTO "); System.out.println(); System.out.println(); System.out.println("4 - USCITA "); } else // Altrimenti permetti altre operazioni if ((dimensione!=0)&&(dimensione<50)) { 15
  • 16. System.out.println("1 - INSERIMENTO "); System.out.println("2 - ELENCAZIONE "); System.out.println("3 - MODIFICA O ELIMINAZIONE "); System.out.println("4 - USCITA "); } else { System.out.println("1 - "); System.out.println("2 - ELENCAZIONE "); System.out.println("3 - MODIFICA O ELIMINAZIONE "); System.out.println("4 - USCITA "); } System.out.print("SCELTA= "); scelta=in.nextInt(); data.close(); // Chiudo il file aperto in lettura per vedere se ci sono o non ci sono elementi if (scelta==1) { apertura=true; data.open("archivio.bin",apertura); // Apriamo il file in scrittura per inserire un nuovo documento data.inserimento(dimensione); // Inserimento di un nuovo documento data.close(); // Chiudiamo il file aperto in scrittura } else if ((scelta==2)&&(vuoto==false)) { apertura=false; data.open("archivio.bin",apertura); // Apriamo il file in lettura per l'elencazione in.nextLine(); System.out.println("DAMMI IL CAMPO DA TROVARE(ARGOMENTO/AUTORE): "); campo=in.nextLine(); // Prendi in input il campo da ricercare data.elencazione(dimensione,campo); // Effettua l'elencazione secondo il campo ricevuto in input data.close(); // Chiudiamo il file aperto in lettura in.nextInt(); // Aspetta che l'utente riesca a visualizzare i dati e poi prosegue } else if ((scelta==3)&&(vuoto==false)) { 16
  • 17. apertura=true; data.open("archivio.bin", apertura);//Apriamo il file in scrittura per la mododifica o l'eliminazione in.nextLine(); System.out.println("DAMMI IL CAMPO DA TROVARE(TITOLO/AUTORE/NUMERO PROGRESSIVO): "); if(in.hasNextInt()) data.ricerca(dimensione,in.nextInt()); // Prendi in input il campo da ricercare se un intero else data.ricerca(dimensione,in.nextLine()); // Prendiamo in input il campo da ricercare se e una stringa data.close(); // Chiudiamo il file aperto in lettura } } catch(IOException exception)//eccezione che gestisce la mancata presenza del file all' avvio del programma { apertura=true; data.open("archivio.bin", apertura); System.out.println("RIAVVIARE PROGRAMMA PER EFFETTUARE OPERAZIONI!"); } finally//chiusura del file { data.close(); } } } } 17