Why is there no System.in.readLine()?
The difficulty of getting a line of input in Java is because of Java's weird asymmetries between input and output: System.out is an OutputStream wrapped in a feature-adding PrintStream, but System.in is a raw InputStream which has no features. I suspect two reasons for this: caution against unwanted character decoding on input, and caution against dividing up inadequately buffered input. The result is that to divide input from System.in into lines you have to wrap it in some other object more sophisticated than a PrintStream. If the only division you need is lines, Scanner provides way more than you need. The least-overkill option I've found is BufferedReader, which adds character decoding (like all Readers) and buffering in addition to .readLine(). It's possible that the buffering will cause timing issues that can be avoided with Scanner, but if timing is really critical you probably shouldn't be using Java. Unfortunately, all of Java's InputStream and Reader classes are blocking, and you can't kill or interrupt threads which are blocking on input, so if you want either non-blocking or multiple threads you must write your own – even then you have to wrap in a InputStreamReader to get the ready() method that allows reading of one character without blocking.
What about System.console.readLine()?
The documentation for Console is not very clear, but it seems to be intended for interaction with something like a POSIX Terminal Interface, which is often called a "console" for historical reasons. Originally, any terminal interface had direct control of the keyboard and screen, which would be in text mode; the same interface in a window is usually called a "virtual terminal" or "virtual console," terms which also have multiple meanings for historical reasons. By default, when a program is run in a terminal interface, the standard input (System.in), standard output (System.out), and standard error (System.err) streams are connected to the terminal, so input comes from the keyboard and output goes to the screen (or window). All command-line interpreters allow all of these streams to be redirected, so that the output of one command can be the input of another command without using the terminal interface in between. It seems that Console is intended to allow access to a console interface only in cases where the standard I/O streams are not redirected. (Even then, it does not go as far as to provide any of the more modern features, such as detecting the window width.) If you need to handle redirected I/O, or need full access to the terminal interface, System.console() is not suitable.
What about the Java Console?
The Java Console has nothing to do with either Console or a POSIX Terminal Interface, it is a way to see error and debug messages from applets or web apps. It does not provide any mechanism for input, and should only be used for development. "Java Console is a simple debugging aid that redirects any System.out and System.err to the console window. It is available for applets running with Java Plug-in and applications running with Java Web Start." (More about those contexts at Applet or Java Web Start Application? in the Java Rich Internet Applications Guide.)