Це може здатися легким, але PrintStreamдрукує до OutputStreamта PrintWriterдрукує до Writer. Гаразд, я сумніваюся, що я отримаю якісь бали за твердження очевидного. Але є більше.
Отже, яка різниця між a OutputStreamі a Writer? Обидва є потоками, головна відмінність яких OutputStream- це потік байтів, а a Writer- потік символів.
Якщо OutputStreamугоди з байтами, а що PrintStream.print(String)? Він перетворює символи в байти, використовуючи кодування платформи за замовчуванням. Використання кодування за замовчуванням, як правило, погано, оскільки це може призвести до помилок при переході з однієї платформи на іншу, особливо якщо ви генеруєте файл на одній платформі та використовуєте його на іншій.
За допомогою параметра a Writer, ви зазвичай вказуєте кодування, яке слід використовувати, уникаючи будь-яких залежностей платформи.
Навіщо турбуватися з тим, що маєте PrintStreamв JDK, оскільки основним завданням є написання символів, а не байтів? PrintStreamдо JDK 1.1, коли були введені потоки символів Reader / Writer. Я думаю, що Сонце було б застарілим, PrintStreamякби тільки той факт, що його так широко використовують. ( В кінці кінців, ви не хотіли б кожен виклик , System.outщоб згенерувати застарілий API попередження! Крім того , зміна типу від PrintStreamдо PrintWriterна стандартних вихідних потоків порвали б існуючі програми.)