Another aspect is inheritance. File descriptors and file handles are trivially easy to inherit, so you can do things like
Code:
prog # outputs to screen
prog > file # outputs to file
Note that having this be this easy was one of the reasons for Unix winning out against Multics. Anyway, this works by having a "stdout" that is inherited from the shell, and so the shell can set it up to point to the terminal or to a file, or to a pipe, and the program doesn't have to know or care. If you do your read/write APIs only on file names, this will not be this simple.