Diferència entre revisions de la pàgina «M3 - Programació»

De wikiserver
Dreceres ràpides: navegació, cerca
(Continguts)
(Continguts)
Línia 26: Línia 26:
  
 
:*[[M3 - Programació estructurada / Continguts UF3: Fitxers orientats a byte |Fitxers orientats a byte]]
 
:*[[M3 - Programació estructurada / Continguts UF3: Fitxers orientats a byte |Fitxers orientats a byte]]
'''Accés següèncial'''
 
 
Les dades s’emmagatzemen com una seqüència de valors, i per tant, l’esquema general que s'aplica en fitxers orientats a caràcter també es pot aplicar a
 
aquest altre tipus.
 
 
Representació de les dades en format binari.
 
 
{|border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;"
 
! align="left" width="170 px" style="background:Lavender; color:Black"|Tipus
 
! align="left" width="150 px" style="background:Lavender; color:Black"|Paura clau Java
 
! align="left" width="100 px" style="background:Lavender; color:Black"|Mide (bytes)
 
|-
 
|caràcter||char||2
 
|-
 
|byte||byte||1
 
|-
 
|enter curt||short||2
 
|-
 
|enter simple||int||4
 
|-
 
|enter llarg||long||8
 
|-
 
|real de simple precisió||float||4
 
|-
 
|real de doble precisió||doble||8
 
|}
 
 
'''Inicialització'''
 
 
<pre>
 
    import java.io.File;
 
    import java.io.RandomAccessFile;    // s’usa tant per llegir com per escriure dades
 
    RandomAccessFile raf = new RandomAccessFile(File ruta, String mode); 
 
                                            // File ruta per especificar la ruta del fitxer
 
                                            // String mode per especificar el mode de treball a l'hora de processar el fitxer
 
</pre>
 
 
Dels modes de treball possibles el dos més utilitzats són:
 
 
:*'''r:''' mode lectura. Errors si el fitxer no existeix o si s'invoca a mètodes d'escriptura.
 
 
:*'''rw:''' mode escriptura-lectura. Si el fitxer no existeix, es crearà un de nou buit. Si existeix, no s’esborren les seves dades.
 
 
'''Escriptura de dades'''
 
 
L’única manera de generar fitxers orientats a byte que puguin ser llegits correctament és mitjançant codi d’un programa.
 
 
Cada cop que es fa una operació de lectura o escriptura, l’apuntador es desplaça automàticament el mateix nombre de bytes amb què s’ha operat.
 
 
Mètodes disponibles per escriure dades:
 
 
{|border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;"
 
! align="left" width="170 px" style="background:Lavender; color:Black"|Mètode
 
! align="left" width="150 px" style="background:Lavender; color:Black"|Bytes escrits
 
|-
 
|writeBoolean(boolean b)||1
 
|-
 
|writeByte (byte v)||1
 
|-
 
|writeChar(char c)||2
 
|-
 
|writeDouble(double d)||8
 
|-
 
|writeFloat(float f)||4
 
|-
 
|writeInt(int i)||4
 
|-
 
|writeLong(long l)||8
 
|-
 
|writeShort(short s)||2
 
|}
 
 
Exemple d'escriptura de 20 enters:
 
<pre>
 
    public class EscriureEntersBinari {
 
 
      public static void main(String[] args) throws IOException {
 
 
        EscriureEntersBinari programa = new EscriureEntersBinari();
 
        programa.inici();
 
    }
 
 
    public void inici() throws FileNotFoundException, IOException {
 
 
      File f = new File("Enters.bin");
 
      RandomAccessFile raf = new RandomAccessFile(f, "rw");
 
      int valor = 1;
 
      for (int i = 0; i < 20; i++) {
 
          raf.writeInt(valor);
 
          valor = valor * 2;
 
      }
 
      System.out.println("Fitxer escrit satisfactòriament.");
 
      raf.close();
 
    }
 
  }
 
</pre>
 
 
'''Sobreescriptura de fitxers'''
 
 
La classe '''RandomAccessFile''' quan escriu en un fitxer, no esborra les dades existents, per la qual cosa pot quedar "brossa" al final del fitxer. En molts casos caldrà eliminar els bytes sobrants un cop acabada l'escriptura.
 
 
Mètodes emprats:
 
 
:* '''setLength(long mida).''' Modifica la mida del fitxer. Si el valor especificat és més petit que la mida actual, s’eliminen totes les dades per sobre de la
 
mida especificada. Si és més gran, el contingut extra és indefinit.
 
 
:* '''long getFilePointer().''' Avalua la posició on és en aquests moments l’apuntador, mesurat en el nombre de bytes des de l’inici del fitxer.
 
 
:* '''long length().''' Retorna la mida del fitxer en bytes.
 
 
Exemple: reemplaç del contingut delfitxer “enters.bin” (20 valors enters), per cinc valors enters -1. El resultat final és un fitxer de només 20 bytes, en lloc de 80.
 
 
<pre>
 
    public class SobreescriureEntersBinari {
 
 
      public static void main(String[] args) throws IOException {
 
 
        SobreescriureEntersBinari programa = new SobreescriureEntersBinari();
 
        programa.inici();
 
      }
 
 
      public void inici() throws FileNotFoundException, IOException {
 
       
 
        File f = new File("Enters.bin");
 
        RandomAccessFile raf = new RandomAccessFile(f, "rw");
 
        long apuntador = raf.getFilePointer();
 
        System.out.println("Inici: Apuntador a posició " + apuntador);
 
        for (int i = 0; i < 5; i++) {
 
          raf.writeInt(-1);
 
        }
 
        apuntador = raf.getFilePointer();
 
        System.out.println("Fi: Apuntador a posició " + apuntador);
 
        raf.setLength(apuntador);
 
        raf.close();
 
        System.out.println("Fitxer modificat correctament.");
 
    }
 
  }
 
</pre>
 
 
'''Lectura de dades'''
 
 
hi ha un mètode específic per a cada tipus de dades:
 
 
{|border="2" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;"
 
! align="left" width="170 px" style="background:Lavender; color:Black"|Mètode
 
! align="left" width="150 px" style="background:Lavender; color:Black"|Tipus de dada llegida
 
|-
 
|readByte()||byte
 
|-
 
|readShort()||short
 
|-
 
|readInt()||int
 
|-
 
|readLong()||long
 
|-
 
|readFloat()||float
 
|-
 
|readDouble()||double
 
|-
 
|readBoolean()||boolean
 
|-
 
|readChar()||char
 
|}
 
 
L'intent de llegir més enllà del darrer valor provocarà una excepció. Es pot calcular quants valors d’un tipus conté el fitxer fent una simple divisió: mida
 
fitxer/mida tipus.
 
 
Exemple: lectura del fitxer "Enters.bin".
 
 
<pre>
 
    public class LlegirEntersBinari {
 
 
      public static void main(String[] args) throws IOException {
 
 
        LlegirEntersBinari programa = new LlegirEntersBinari();
 
        programa.inici();
 
      }
 
 
      public void inici() throws IOException {
 
 
        File f = new File("Enters.bin");
 
        RandomAccessFile raf = new RandomAccessFile(f, "r");
 
        long numEnters = f.length() / 4;
 
        System.out.println("Hi ha " + numEnters + " enters.");
 
        for (int i = 0; i < numEnters; i++) {
 
          int valor = raf.readInt();
 
          System.out.println("S’ha llegit el valor " + valor);
 
        }
 
        raf.close();
 
      }
 
    }
 
</pre>
 
 
'''Lectura incorrecta de dades'''
 
 
La classe '''RandomAccessFile''' quan executa qualsevol dels seus mètode de lectura, sempre llegeix el nombre de bytes associats al tipus de dada que es vol llegir, i els interpreta al valor que correspon dins aquest tipus. El programa no ens avisarà en cap excepció.
 
 
====Arxius d’accés directe====
 
 
'''Posicionament'''
 
 
'''Lectura directa de dades'''
 
 
'''Escriptura directa de dades'''
 
 
'''Seek més enllà de la mida del fitxer'''
 

Revisió del 13:27, 4 feb 2018

UF1: Programació Estructurada

Activitats

UF3: Fonament de gestió de fitxers

Continguts