Els programes utilitzen variables per emmagatzemar informació:

  • Les dades d'entrada.
  • Els resultats calculats.
  • Els valors intermedis generats al llarg del càlcul.

Tota aquesta informació és efímera: quan acaba el programa, tot desapareix. Però per a moltes aplicacions, serà important poder emmagatzemar dades de manera permanent.

Un arxiu o fitxer el podríem definir com:

"Un conjunt de bits emmagatzemats en un dispositiu, i accessible a través d'un camí d'accés (pathname) que l'identifica."

Aquesta versió de baix nivell, si bé és completament certa, és massa simple...

Per això definirem diversos criteris per distingir diverses subcategories d'arxius. Aquests tipus d'arxiu es diferenciaran des del punt de vista de la programació: cadascun d'ells proporcionarà diferents funcionalitats (mètodes) per a la seva manipulació.

El criteri de contingut:

Sabem que és diferent manipular números que Strings, tot i que en el fons tots dos acabin sent bits en la memòria de l'ordinador. Per això, quan manipulem arxius, distingirem dues classes d'arxius depenent del tipus de dades que contenen:

  • Els arxius de caràcters (o de text)
  • Els arxius de bytes (o binaris)

Un fitxer és aquell format exclusivament per caràcters i que es pot crear i visualitzar utilitzant un editor. Les operacions de lectura i escriptura treballaran amb caràcters. Per exemple, els fitxers amb codi Java són fitxers de text. En canvi un fitxer binari ja no està format per caràcters sinó que els bytes que conté poden representar altres coses com números, imatges, so...

El criteri del mode d'accés.

Existeixen dos modes bàsics d'accés a la informació continguda en un arxiu:

  • Seqüencial.
  • Accés directe.

En el mode seqüencial la informació de l'arxiu és una seqüència de bytes (o caràcters) de manera que per accedir al byte (o caràcter) i-èsim (s'anomena d'aquesta manera quan estem parlant d'un cas general i que per tant no coneixem el número exacte) s'ha d'haver accedit anteriorment als i-1 anteriors.

En el mode d'accés directe ens permet accedir directament a la informació del byte i-èsim. Un exemple molt conegut d'accés directe el tenim amb els vectors (arrays).

Primer podrem observar un exemple de codi que escriu en mode stream:

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException;
/** * Clase que lee y escribe el fichero en modo Stream */
public class Stream {
   public static void main(String[] args) throws IOException {
        FileInputStream in = null; 
        FileOutputStream out = null;
        try{
            in = new FileInputStream("entrada.txt"); 
            out = new FileOutputStream("salida.txt"); 
            int c;
            while ((c = in.read()) != -1) {
                System.out.println(c);                 
                out.write(c);             
            }
        }finally {
            if (in != null) {
                in.close(); 
            }
            if (out != null) {
                out.close();             
            }
        }

    }
}

Descarregar.

<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/DZH6cctVGFI" width="560"></iframe>

Una altra opció és anar carregant-ho en memòria:

import java.io.BufferedReader; 
import java.io.FileReader;
 import java.io.FileWriter; 
import java.io.PrintWriter;
 import java.io.IOException;
/** * Clase que lee y escribe el fichero en memoria */ 
public class ReaderWritter {
    public static void main(String[] args) throws IOException {
        BufferedReader inputStream = null;
        PrintWriter outputStream = null;
        try {
            inputStream = new BufferedReader(new FileReader("entrada.txt")); 
            outputStream = new PrintWriter(new FileWriter("salida.txt"));
            String l;
            while ((l = inputStream.readLine()) != null) {
                System.out.println(l); 
                outputStream.println(l); 
            }
        } finally {
            if (inputStream != null) {
                inputStream.close();
                }
            if (outputStream != null) {
                outputStream.close();
                }
        }
    }
}

Descarregar.

<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/NFYSq2vL3uU" width="560"></iframe>

Descarrega tot.