They're all intended for use in different things. I'll do my best to explain, but I didn't totally understand the docs and I haven't used each of these extensively, so if you spot any mistakes please let me know.
The Scanner
class is meant to process input from just about any stream and give the developer a nice, easy way to manage it without learning too many classes. It's fairly basic, but most of the time, it's plenty enough -- for example, if you just want to get user input in a simple-to-learn way, Scanner
is what you want.
The BufferedReader
class is meant to read from files quickly, at the expense of memory. It's meant to be a wrapper around other, simpler classes like FileInputStream
(technically, any class which extends InputStream
) and, by buffering the next few bytes and reading from that array instead of directly the stream, and only reading from the stream when it reaches the end of the buffer. If you're more interested in speed than low memory usage, you'll want this -- though it really doesn't use much more memory unless you explicitly tell it to.
DataInputStream
is a more general input class for data. It's if you just want to read primitives from a stream -- rather than reading individual bits directly and composing the respective types, this provides a simple method to do that for you. This page is where the docs say to go for more information about how the methods actually work.
The Console
class is explicitly for a command line interface (CLI) program -- that is, for reading data from and writing data to a console. It's like Scanner
-- a simple, easy-to-learn class for doing basic tasks.
In a sentence, they're meant for different tasks, and which one you use should be determined by what you're trying to do.