Intro

I/O Intro
Un qualsiasi programma ha la necessità, almeno una volta nella sua vita, di interagire con il resto del mondo e lo fa con quello che in informatica è noto come input/output o I/O.

Un computer può essere collegato a molti tipi diversi di periferiche di I/O e la comunicazione tra un'applicazione e uno qualsiasi di questi dispositivi avviene, come ben sappiamo dalla teoria dei sistemi operativi, attraverso:
 * **system call** che il sistema operativo fornisce all'applicazione
 * **device driver** che il sistema operativo usa per pilotare l'hardware del dispositivo

Le system call per l'I/O sono anche note come I/O API. Queste system call realizzano un'astrazione che nasconde i dettagli dei diversi dispositivi hardware. E, come al solito, le system call fornite dal sistema operativo sono poi //girate//, con modalità diverse, ai programmatori dai vari linguaggi di programmazione.

C# //gira// le system call per l'I/O fornendo vari strumenti. Alcuni esempi sono le classi che implementano gli stream, i file e le socket.

Il concetto astratto di stream, e le classi che lo implementano, è alla base di tutto l'I/O di C#. Gli **stream** infatti rappresentano il **flusso** **di dati** che si genera durante l'I/O.

**I/O STREAM**

Quando si parla di I/O si ha a che fare con due categorie di informazioni:
 * **dati binari** formattati dalla macchina (int, float, …)
 * **testo** (leggibile dall'uomo) (ASCII, Unicode, ...)

C# fornisce perciò due diverse categorie di stream:
 * **stream binari** che rappresentano il flusso dei dati binari
 * **stream di testo** che rappresentano il flusso di testo

Ma cos'è uno stream?

Uno **stream** rappresenta **o** una **sequenza di dati in input** proveniente da una sorgente di informazioni <span style="display: block; font-family: Verdana,sans-serif; font-size: 12px; text-align: justify;">(da cui **si può leggere**) <span style="display: block; font-family: Verdana,sans-serif; font-size: 14.6667px; text-align: justify;">**o** una **sequenza di dati in output** verso una destinazione di informazioni <span style="display: block; font-family: Verdana,sans-serif; font-size: 12px; text-align: justify;">(in cui **si può scrivere**) <span style="display: block; font-family: Verdana,sans-serif; font-size: 14.6667px; text-align: justify;">.

<span style="display: block; font-family: Verdana,sans-serif; font-size: 14.6667px; text-align: justify;">C'è differenza tra stream e file:
 * <span style="display: block; font-family: Verdana,sans-serif; font-size: 12px; text-align: justify;">un file è una collezione di byte con un nome (path name) memorizzata su memoria di massa. E' quindi o una sorgente o una destinazione di dati.
 * <span style="display: block; font-family: Verdana,sans-serif; font-size: 12px; text-align: justify;">uno stream è una sequenza di byte letta da o scritta su... una memoria di massa, certo, ma anche una RAM o una scheda di rete. Quindi lo stream è il flusso dei dati.
 * <span style="display: block; font-family: Verdana,sans-serif; font-size: 12px; text-align: justify;">Un file può essere una sorgente o una destinazione di dati da associare ad uno stream!!

<span style="display: block; font-family: Verdana,sans-serif; font-size: 14.6667px; text-align: justify;">Le operazioni possibili su uno stream sono fondamentalmente le tre seguenti:
 * <span style="display: block; font-family: Verdana,sans-serif; font-size: 14.6667px; text-align: justify;">**uno stream può essere letto**. <span style="display: block; font-family: Verdana,sans-serif; font-size: 12px; text-align: justify;">La lettura è il trasferimento di dati da uno stream di input ad una variabile (array di byte, struttura dati,...)
 * <span style="display: block; font-family: Verdana,sans-serif; font-size: 14.6667px; text-align: justify;">**uno stream può essere scritto**. <span style="display: block; font-family: Verdana,sans-serif; font-size: 12px; text-align: justify;">La scrittura è il trasferimento di dati da una variabile ad uno stream di output.
 * <span style="display: block; font-family: Verdana,sans-serif; font-size: 14.6667px; text-align: justify;">**uno stream può permettere lo spiazzamento** <span style="display: block; font-family: Verdana,sans-serif; font-size: 12px; text-align: justify;">(//**seeking**//)cioè la richiesta di spostamento **della posizione corrente da cui leggere o scrivere** nello stream.

<span style="display: block; font-family: Verdana,sans-serif; font-size: 14.6667px; text-align: justify;">Ovviamente, uno stream supporta tutte o solo alcune delle operazioni elencate, in dipendenza dalla sorgente o destinazione fisica associata. Ad esempio, uno stream associato ad un file di disco permette tutto; uno stream associato alla scheda di rete non permette il seeking; uno stream associato al monitor permette la scrittura e il seeking ma non certo la lettura.

<span style="display: block; font-family: Verdana,sans-serif; font-size: 90%; text-align: justify;">File Intro