Traditional synchronous I/O is designed for traditional applications...
Files may be large but not huge. It's possible to read an entire file into memory. An application reads or write only to a few files or network connections at the same time, ideally using only one stream at a time The application is sequential. It won't be able to do muc until it's finished reading or writing a file.
A correct usage of read() would be to read chunks of a file and collect them in a buffer like so: