I assume leaving the "data" variable out of the read() call was a typo. Otherwise I think you got it. It will read one buffer full, write it to the output, and repeat until done.
The idea is as long as you're making the OS tell the device to position the read head on the disk, grab a lot of bytes. Fewer and larger physical reads should be better. How much should you buffer? Probably as much as you can fit in memory. Maybe there is some optimum for the OS or the disk hardware but you don't even want to know about those.
Java's BufferedInputStream (and output) do the same thing for you. I've never looked into their buffer sizes beyond this note in BufferedReader: "The buffer size may be specified, or the default size may be used. The default is large enough for most purposes."