IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

Els streams poden ser Input / Output (I/O). Representa un origen de dades i una destinació de dades qualsevol. Un Stream pot representar diferents tipus d'origens i/o destinacions:

Fitxers o disk files
Dispositius de hardware devices i/o perifèrics
Altres programes
Memory arrays
network sockets
...

Els streams de java suporten diferents tipus de dades des de bytes, a tipus de daes primitius (enters, booleans, etc), caracters localitzats, objectes...

Els streams simplement mouen les dades, la manipulació de les mateixes la fan tercers, no els propis streams.

No importa com funcionin els streams internament, tots representen el mateix model:

Hugolucas ioread.jpeg
Hugolucas iowrite.jpeg

InputStream i OutputStream

Són les classes abstractes en la que es basen tots els tipus d'Streams en Java.

Byte Streams

Els Byte Streams o fluxos de bytes són el tipus d'streams o fluxes més basics. Cal tenir en compte que el byte (més que el bit) és la unitat típica mínima d'opetacions d'entrada/sortida (I/O).

Els programes Java utilitzen byte streams per realitzar operacions d'entrada sortida en unitats de 8 bits = 1 byte. Totes les clases d'aquest tipus són filles de les clases InputStream i OutputStream.

Hi ha múliples tipus de classes byte stream, algunes s'expliquen als següents apartats. Cal tenir en compte que totes funcionaran de forma similar, l'únic que canviarà serà la creació del Stream.

FileInputStream i FileOutputStream

Els fitxers es poden llegir i escriure utilitzant les clases FileInputStream i FileOutputStream

Vegem un exemple:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyBytes {
    public static void main(String[] args) throws IOException {

        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            in = new FileInputStream("in.txt");
            out = new FileOutputStream("out.txt");
            int c;

            while ((c = in.read()) != -1) {
                out.write(c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

Aquest exemple el que fa és agafar un fitxer d'entrada (in.txt) i copia tot el seu contingut a out.txt.

El més important és el tros de codi:

while ((c = in.read()) != -1) {
               out.write(c);
           }

On anem llegint byte a byte el fitxer original, segons es pot veure a la gràfica següent:

TODO: http://docs.oracle.com/javase/tutorial/essential/io/bytestreams.html

http://docs.oracle.com/javase/tutorial/essential/io/bytestreams.html

NOTA: El fitxer ha d'estar a la mateixa carpeta on s'executa el programa i s'ha de dir exactament igual. podeu indicar un path complet, però OCO! la forma en que s'especifiquen paths depèn del sistema operatiu i pot fer que la vostra aplicació deixi de ser multiplataforma

Observeu el tros de codi:

IMPORTANT: Sempre cal tancar els streams per alliberar recursos. Fixeu-vos l'ús del bloc finally per assegurar-se que el stream es tanqui inclús en cas d'errors. Aquesta tècnica permet eviar els resource leaks o especificament els memory leaks

Cal tenir en compte que els Byte Streams no són la forma més eficient de treballar amb dades I/O, ja que estem treballant a un nivell molt baix de sistema, és a dir de la forma més primitiva possible. Per exemple per a un fitxer podria ser més interesant treballar amb streams de caràcters.

NOTA: Que no sigui la forma més eficient no vol dir que no valgui la penda entendre com funciona, ja que tota la resta d'Streams es basen en Streams de bytes

Vegeu també

http://acacha.org/mediawiki/index.php/Java_Streams