SlideShare a Scribd company logo
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

More Related Content

Similar to 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_partII
MobileSchool
 
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
Sergio 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 4
Ivan Gualandri
 
Java lezione 6
Java lezione 6Java lezione 6
Java lezione 6
Sergio Ronchi
 
Sistemi operativi Fabiano Dalla Piazza
Sistemi operativi  Fabiano Dalla PiazzaSistemi operativi  Fabiano Dalla Piazza
Sistemi operativi Fabiano Dalla PiazzaFabiano Dalla Piazza
 
Java lezione 19
Java lezione 19Java lezione 19
Java lezione 19
Sergio Ronchi
 

Similar to 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
 

More from 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 - WebWord
Alartzero
 
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
 

More from 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