Между чем различие PrintStream
и PrintWriter
? У них есть много методов, общих, из-за которого я часто перепутываю эти два класса. Кроме того, я думаю, что мы можем использовать их для точно того же самого. Но должно быть различие, иначе, был бы только один класс.
Я искал архивы, но не мог найти этот вопрос.
Это может показаться легкомысленным, но PrintStream
печатает в OutputStream
и PrintWriter
печатает на Writer
. Хорошо, я сомневаюсь, что получу какие-то баллы за утверждение очевидного. Но это еще не все.
Итак, в чем разница между OutputStream
и Writer
?
Оба являются потоками, с основным отличием OutputStream
- это поток байтов, а Writer
- это поток символов.
Если OutputStream
имеет дело с байтами, как насчет PrintStream.print (String)
? Он преобразует символы в байты, используя кодировку платформы по умолчанию. Использование кодировки по умолчанию, как правило, плохо, поскольку это может привести к ошибкам при переходе с одной платформы на другую, особенно если вы создаете файл на одной платформе и используете его на другой.
В Writer
вы обычно указываете кодировку для использования, избегая каких-либо зависимостей от платформы.
Зачем иметь в JDK PrintStream
, если основное предназначение - писать символы, а не байты? PrintStream
предшествует JDK 1.1, когда были введены потоки символов Reader / Writer.Я полагаю, что Sun отказалась бы от PrintStream
, если бы только потому, что он так широко используется. (В конце концов, вы не хотите, чтобы каждый вызов System.out
генерировал предупреждение об устаревшем API! Кроме того, изменение типа с PrintStream
на PrintWriter
на стандартные выходные потоки нарушили бы существующие приложения.)
Вы можете записывать необработанные байты в поток, но не в модуль записи. Документ javadoc PrintWriter перечисляет другие различия (самое главное, возможность установить кодировку в потоке, чтобы он мог интерпретировать необработанные байты, я бы сказал).
Писатели, такие как PrintWriter, предназначены для вывода текста, потоки - для двоичного вывода. Писатели обрабатывают набор символов за вас. Потоки этого не делают, потому что предполагается, что вам не нужно такое преобразование, которое испортит ваши двоичные данные, и вы будете использовать писатель.
С помощью PrintStream
вы придерживаетесь кодировки платформы по умолчанию.
PrintStream stream = new PrintStream(output);
Однако с помощью PrintWriter
вы можете передать OutputStreamWriter
с определенной кодировкой.
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
Преимущество в том, что вы можете управлять кодировкой символов, в которой должны быть написаны символы, чтобы они в конечном итоге не превратились в mojibake .