What is the difference between DataInput/OutputStream and BufferedInput/ouputStream?

Let me preface this post with a single caution. I am a total beginner and i really want to learn and understand the best way to do these things. In addition to my top question, in what conditions can i use DataInput/OutputStream and BufferedInput/ouputStream? Thanks