The IO Chapter of the Java Tutorial lays everything out fairly clearly. Streams are an abstraction that take some thinking to master, but once you figure out what the various streams do, it's easy to connect them together to achieve complex functionality. Also, once you figure out how to write to one destination (i.e. a file), you can write to any destination (socket, database, byte array and so on) using nearly the same classes. That's the power of object oriented programming at work.