So I'm using PhysFS to do file I/O on windows, linux, mac, Android, and I think it'll work on iOS as well.
PhysFS has file read functions like PHYSFS_ReadSLE16 to read a signed little endian 16 bit value from a file.
I assume it does something internally with the files to make this efficient, such as unzipping blocks of the file at a time and keeping a buffer to read from rather than unzipping the file every time I want to read a single value.
OK, after a lot of reading of the docs I found the PHYSFS_SetBuffer function. It says that file IO is unbuffered by default. I guess that solves that question.