UNIXはこの状況に対していくつかの重要な進化を遂げている。その1つが「抽象デバイス(英: abstract device)」である。これはプログラム自体がやり取りするデバイスに関する知識を持たなくて済むようにしたものである。古いOSではプログラマはレコード構造を知っておく必要があり、直交性のないことが多いデータ意味論やデバイス制御を扱う必要があった。UNIXはデータストリームという概念によってこのような複雑さを排除した。データストリームとは逐次的なデータバイト列であり、End Of Fileまでリード可能である。プログラムはまた好きなだけバイト列を出力でき、事前にバイト数を宣言しておく必要もないし、それらがどのようにグループ化されているかを宣言する必要もない。
標準エラー出力(英: standard error, stderr)は、エラーメッセージや診断メッセージを出力するためのもう1つの出力ストリームである。標準出力とは独立しているため、一方だけをリダイレクトすることができる。デフォルトでは端末(のディスプレイ)になっており、標準出力がリダイレクトされていて画面に表示されなくとも、エラーメッセージだけはユーザーが目にするようになっている。例えば、パイプで出力が他のプログラムの入力に接続されている場合でも、標準エラー出力は直接端末のディスプレイに届く。
ALGOL 68では、入力 (input) と出力 (output) をあわせてtransputと呼ぶ。Cornelis H. A. Kosterはtransput標準を定義した。この標準にはstand in、stand out、stand error、stand backがある。
例:
# ALGOL 68 example #
main:(
REAL number;
getf(stand in,($g$,number));
printf(($"Number is: "g(6,4)"OR "$,number)); # OR #
putf(stand out,($" Number is: "g(6,4)"!"$,number));
newline(stand out)
)
// C# examplepublicstaticintMain(string[]args){try{strings=System.Console.In.ReadLine();doublenumber=double.Parse(s);System.Console.Out.WriteLine("Number is: {0:F3}",number);return0;// If Parse() threw an exception}catch(System.ArgumentNullException){System.Console.Error.WriteLine("No number was entered!");}catch(System.FormatException){System.Console.Error.WriteLine("The specified value is not a valid number!");}catch(System.OverflowException){System.Console.Error.WriteLine("The specified number is too big!");}return-1;}
' Visual Basic .NET examplePublicFunctionMain()AsIntegerDimnumberAsDoubleDimsAsStringTrys=System.Console.In.ReadLine()number=CDbl(s)System.Console.Out.WriteLine("Number is: {0:F3}",number)Return0CatcheAsSystem.InvalidCastException' if CDbl() threw an exceptionSystem.Console.Error.WriteLine("No number was entered!")Return1EndTryEndFunction