[Keith]: BufferedReader doesn't rely on breaking up its input into tokens. It allows you to read character by character if you want. It can read an entire line and let you do what you want. You can easily read a whole line with Scanner too, using nextLine(). It's also possible to read one character at a time with next() if you useDelimiter(""), but this is not obvious. Of course you can also read a line or other
String and then use charAt() to look it individual chars if that's what you want.
The one thing I don't quite like about Scanner is that if an IOException occurs in an underlying stream, it can be easily overlooked. Admittedly the most common IOExceptions are probably FileNotFound, which
is thrown as expected by the new Scanner(File) constructor if there's a problem finding a file. But if other problems occur after the Scanner is created - you lose a network connection, for example - then it looks like the various hasNextXXX() methods will simply return false. You really should check the value of scanner.ioException() when you're done, so see if everything's really OK:
This isn't any more work than catching exceptions from stream - the danger though is that Scanner makes it all too easy to simply forget to do it. Something to beware of...