تفاوت اصلی این دو کلاس در فلسفه ایجاد شدن هر کدام است. قابلیت اصلی کلاس Scanner، تجزیه کردن (pars) محتوای یک stream است در حالی که BufferedReader هیچ گونه عملیاتی برای تجزیه کردن (pars) محتوای stream ندارد در عوض قابلیت اصلی آن استفاده از buffer برای بالا بردن کارایی است.
متد های کلاس BufferedReader قابلیت synchronized دارند در حالی Scanner خیر.
پیشنهاد من اینه که اگر می خواهید یک فایل را فقط بخوانید از BufferedReader استفاده کنید ولی اگر می خواهید فایل را بخوانید و عملیات تجزیه کردن (pars) برروی آن انجام دهید از Scanner استفاده کنید و بعنوان constructor به آن BufferedReader بدهید (برای داشتن کارایی بهتر):
Scanner scanner = new Scanner(new BufferedReader(
new InputStreamReader(System.in)));