Vous devez considérer les flux comme des abstractions sur les "sources" ou les "puits" de données sous-jacents. Une source est quelque chose à partir duquel vous lisez des données, et un puits est quelque chose vers lequel vous écrivez des données.
Le concept de flux vous permet d'effectuer des E/S sur différentes formes de médias, de connexions réseau, de tuyaux entre applications, de fichiers, etc.
L'abstraction des flux est très précieuse pour nous, développeurs, car elle nous permet de simplifier l'entrée et la sortie, et nous donne la flexibilité d'organiser et de reconnecter les sources et les destinations de ces flux.
Une bonne analogie est celle d'un tuyau. Vous pouvez envoyer et recevoir des données par le biais de tuyaux, et vous pouvez connecter ces tuyaux à divers éléments.
En permettant aux programmes de se parler par le biais de tuyaux, nous permettons à toutes sortes de programmes de se parler entre eux, et nous augmentons considérablement l'interopérabilité et l'utilité.
C'est le cœur de la philosophie d'UNIX, et cela permet d'utiliser des idiomes de programmation très puissants.