Les flots les plus élémentaires sont des flots d'octets. Les classes des flots d'octets en écriture ont un nom en ...OutputStream ; celles des flots d'octets en lecture ont un nom en ...InputStream. Pour travailler avec des flots de caractères Unicode, on utilisera des classes en ...Writer (en écriture) et ...Reader (en lecture). Toutes ces classes font partie du paquet java.io ; les unités de compilation faisant appel à ces classes commenceront donc, par commodité, par :
import java.io.*;
Les méthodes générales de lecture sur un flot d'octets, déclarées dans la classe abstraite InputStream sont :
Les méthodes générales d'écriture sur un flot d'octets, déclarées dans la classe abstraite OutputStream , sont :
Comme premier exemple d'utilisation de ces méthodes, la procédure suivante lit sur un flot d'octets in, octet par octet, et les écrit sur un flot d'octets out ; on notera que les types des paramètres sont abstraits :
static void copier(InputStream in, OutputStream out) throws IOException { int c; while ((c = in.read()) != -1) out.write(c); }
En l'absence de récupération de l'exception IOException , cette procédure doit déclarer qu'elle est susceptible de déclencher (c'est-à-dire de propager) cette exception. Une autre façon d'écrire cette itération est la suivante :
int c = in.read(); while (c != -1) { out.write(c); c = in.read(); }
Toute application peut accéder aux flots standards d'entrée System.in (de type InputStream, connecté par défaut au clavier), de sortie System.out et de sortie d'erreur System.err (tous deux de type PrintStream, sous-type de OutputStream, et connectés par défaut à l'écran). La procédure copier() peut servir à recopier du clavier à l'écran les caractères tapés par l'utilisateur :
copier(System.in, System.out);