Simplifying a bit, that would be the business of the VFS kernel subsystem, not the userland app.
For all we know that data might live on memory-mapped file system, or on NFS, etc. etc., so kernel shields users from all the complexity, and gives us this handy "file" abstraction, which is just a path over single-rooted directory tree and bunch of attributes, and a set of operations (system calls) to apply (yes, very much the original OO :).
On the system internals side, the file is usually delivered into in-kernel page cache by appropriate FS driver while, or even before, your app blocks in read(2)
or something.