Java I/O je prilično komplikovan. Pruža mnogo opcija korisniku, ali je zato prilično komplikovan za korištenje.
Console služi samo za čitanje sa konzole, i radi posao ako je samo to potrebno. Prilično je jednostavan i shvatljiv. Ja ga lično ne koristim.
BufferedReader je samo wrapper(omotač) oko ostalih Reader-a koji čitaju karaktere
http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html , i on služi za ubrzavanje čitanja. Da ne bi čitali znak po znak, on će da pročita više znakova odjednom i da ih sačuva u svojoj memoriji. BufferedReader sam ne radi ništa. Njemu je potreban objekat koji će ustvari da "vrši čitanje", te stoga treba da ispišeš mnogo stvari kada ga inicijalizuješ
Code:
new BufferedReader(new InputStreamReader(System.in))
Praviš novi BufferedReader, ali mu daješ InputStreamReader i uloga BufferedReadera je da ustvari ubrza rad sa InputStreamReaderom. InputStreamReader će da "pretvori" bajtove koje dobije iz svog InputStreama u karaktere. Njegov InputStream je System.in - konzola.
Znači : sa konzole se šalju bajtovi (System.in), InputStreamReader ih "pretvara" u karaktere i skladišti ih u BufferedReader-u sa kojim ti radiš.
Scanner je još jedna stepenica iznad. On ne samo da čita strim, nego ga može i parsirati. Skeneru možeš proslijediti BufferedReader kao strim sa koga treba da čitaš.
Ja ti preporučujem da koristiš BufferedReader ako čitaš iz nekih fajlova ili sa mreže. Ukoliko podatke treba da parsiraš, onda koristi Scanner(možeš čak gurnuti i čitav onaj BufferedReader koji si napravio za čitanje fajla u prethodnoj rečenici). Napomena : Scanner nije thread safe dok BufferedReader jeste(ova izjava će ti biti jasnija kada naučiš niti).
Ukoliko čitaš sa konzole, onda je ok da koristiš Console, ako ti je tako lakše.
Pozdrav