Почему API PrintStream говорит, что PrintStream всегда преобразуется в байты, используя стандартную кодировку платформы, в то время как существуют конструкторы с кодировкой? [Дубликат]

Сомневаюсь, что это «самый Pythonic», но что-то вроде:

>>> falseList = [1,2,3,4]
>>> trueList = [1, 1, 1]
>>> 
>>> def testList(list):
...   for item in list[1:]:
...     if item != list[0]:
...       return False
...   return True
... 
>>> testList(falseList)
False
>>> testList(trueList)
True

выполнит трюк.

115
задан Shubham Goyal 21 October 2012 в 19:25
поделиться

6 ответов

Это может звучать легкомысленно, но PrintStream печатает на OutputStream, а PrintWriter печатает на Writer. Хорошо, я сомневаюсь, что у меня появятся какие-то баллы за то, что я заявляю очевидное. Но есть еще.

Итак, в чем разница между OutputStream и Writer? Оба являются потоками, причем основным отличием является OutputStream - поток байтов, а Writer - поток символов.

Если OutputStream имеет дело с байтами, как насчет PrintStream.print(String)? Он преобразует символы в байты, используя кодировку платформы по умолчанию. Использование кодировки по умолчанию, как правило, плохо, поскольку это может привести к ошибкам при переходе с одной платформы на другую, особенно если вы создаете файл на одной платформе и потребляете его на другом.

С помощью функции Writer, вы обычно указываете используемую кодировку, избегая любых зависимостей между платформами.

Зачем беспокоиться о PrintStream в JDK, поскольку основной целью является запись символов, а не байтов? PrintStream предшествует JDK 1.1, когда введены потоки символов Reader / Writer. Я полагаю, что Солнце бы устарело PrintStream, если бы только тот факт, что он так широко используется. (В конце концов, вы не захотите, чтобы каждый вызов System.out генерировал устаревшее предупреждение api! Также, изменение типа от PrintStream до PrintWriter в стандартных потоках вывода нарушило бы существующие приложения.)

120
ответ дан Ciro Santilli 新疆改造中心 六四事件 法轮功 19 August 2018 в 06:35
поделиться
  • 1
    Это то, о чем я думал, но это неправда. Даже PrintStream поддерживает Writer под капотом - если вы передадите ему OutputStream, он обернет его. – Jon Skeet 12 May 2010 в 20:21
  • 2
    @Jon - внутри, есть Writer, но он записывается в OutputStream, поэтому чистый эффект заключается в том, что PrintStream записывает в OutputStream - преобразование char в байт происходит и использует кодировку платформы по умолчанию. Нет такого требования для преобразования char & gt; байта в PrintWriter, вы можете оставаться с символами полностью. – mdma 12 May 2010 в 20:29
  • 3
    Я пропустил тот факт, что вы не можете передать Writer директору PrintStream ... – Jon Skeet 12 May 2010 в 20:54
  • 4
    Поскольку Java 1.5, PrintStream не ограничивается использованием кодировки по умолчанию для платформы; есть конструкторы, которые принимают имя кодировки. Таким образом, различия между PrintStream и PrintWriter заключаются в том, что PrintWriter не может писать сырые байты, а два класса переносят разные типы адресатов. – Ted Hopp 9 May 2013 в 04:47
  • 5
    Возможно, стоит также отметить значительную разницу в их поведении, в то время как они эффективно используют методы PrintStream PrintStream интерфейса PrintStream - удобные функции, которые вызывают write(), поэтому они активируют автозапуск, если они включены. PrintWriter, с другой стороны, не будет автоматически блокироваться после вызова print(). Сегодня я демонстрировал некоторые новички Java, и это привлекло некоторых студентов, которые не были знакомы с необходимостью ручной очистки. В противном случае ваш ответ велик. – Robadob 6 October 2015 в 16:45

Начиная с JDK 1.4, можно указать кодировку символов для PrintStream. Таким образом, различия между PrintStream и PrintWriter связаны только с режимом автоматического сброса и что PrintStream не может обернуть Writer.

17
ответ дан Renan Vinícius Mozone 19 August 2018 в 06:35
поделиться

Писатели, такие как PrintWriter, предназначены для вывода текста, потоки для двоичного вывода. Писатели обрабатывают набор символов для вас. Потоки не потому, что предполагается, что вы не хотите такого преобразования, которое испортило бы ваши двоичные данные и использовало бы автора, если бы вы это сделали.

3
ответ дан sblundy 19 August 2018 в 06:35
поделиться
  • 1
    За исключением PrintStream, потому что тот берет кодировку, чтобы она могла обрабатывать бит больше, чем стандартный OutputStream. – Simon Groenewolt 12 May 2010 в 20:25
  • 2
    Звучит странно, что System.out, единственной целью которого является печать строк, на самом деле является PrintStream. – mins 24 May 2014 в 23:53
  • 3
    «Авторы обрабатывают набор символов для вас». - только писатели, которые занимаются преобразованием символов в байты. Не все писатели. – Aivar 7 April 2015 в 15:20

С помощью PrintStream вы придерживаетесь стандартного кодирования платформы.

PrintStream stream = new PrintStream(output);

С помощью PrintWriter вы можете пройти OutputStreamWriter с определенным кодированием.

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

Преимущество состоит в том, что вы можете управлять кодировкой символов, символы должны быть написаны так, t в конечном итоге заканчивается как mojibake .

59
ответ дан Sebastian 19 August 2018 в 06:35
поделиться
  • 1
    +1 для того, чтобы научить меня новому слову, mojibake :) – Jonik 12 May 2010 в 21:49
  • 2
    Начиная с версии 1.4 существует новый конструктор для PrintStream, который принимает кодировку PrintStream(OutputStream out, boolean autoFlush, String encoding) – artbristol 15 December 2011 в 12:59
  • 3
    благодаря! - Я точно искал способ печати в массив байтов с определенной кодировкой. – Pierre D 31 July 2012 в 19:40

Вы можете писать сырые байты в поток, а не в Writer. В PrintWriter javadoc перечислены другие отличия (самое главное, возможность установки кодировки в потоке, чтобы он мог интерпретировать необработанные байты, которые я бы сказал).

2
ответ дан Simon Groenewolt 19 August 2018 в 06:35
поделиться

Printwriter - это усовершенствование печати.

I.E. printstream для определенной цели.

-1
ответ дан Spoo 19 August 2018 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: