Сомневаюсь, что это «самый 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
выполнит трюк.
Это может звучать легкомысленно, но 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
в стандартных потоках вывода нарушило бы существующие приложения.)
Начиная с JDK 1.4, можно указать кодировку символов для PrintStream. Таким образом, различия между PrintStream и PrintWriter связаны только с режимом автоматического сброса и что PrintStream не может обернуть Writer.
Писатели, такие как PrintWriter, предназначены для вывода текста, потоки для двоичного вывода. Писатели обрабатывают набор символов для вас. Потоки не потому, что предполагается, что вы не хотите такого преобразования, которое испортило бы ваши двоичные данные и использовало бы автора, если бы вы это сделали.
С помощью PrintStream
вы придерживаетесь стандартного кодирования платформы.
PrintStream stream = new PrintStream(output);
С помощью PrintWriter
вы можете пройти OutputStreamWriter
с определенным кодированием.
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
Преимущество состоит в том, что вы можете управлять кодировкой символов, символы должны быть написаны так, t в конечном итоге заканчивается как mojibake .
PrintStream(OutputStream out, boolean autoFlush, String encoding)
– artbristol
15 December 2011 в 12:59
Вы можете писать сырые байты в поток, а не в Writer. В PrintWriter javadoc перечислены другие отличия (самое главное, возможность установки кодировки в потоке, чтобы он мог интерпретировать необработанные байты, которые я бы сказал).
Printwriter - это усовершенствование печати.
I.E. printstream для определенной цели.
PrintStream
не ограничивается использованием кодировки по умолчанию для платформы; есть конструкторы, которые принимают имя кодировки. Таким образом, различия междуPrintStream
иPrintWriter
заключаются в том, чтоPrintWriter
не может писать сырые байты, а два класса переносят разные типы адресатов. – Ted Hopp 9 May 2013 в 04:47PrintStream
PrintStream
интерфейсаPrintStream
- удобные функции, которые вызываютwrite()
, поэтому они активируют автозапуск, если они включены.PrintWriter
, с другой стороны, не будет автоматически блокироваться после вызоваprint()
. Сегодня я демонстрировал некоторые новички Java, и это привлекло некоторых студентов, которые не были знакомы с необходимостью ручной очистки. В противном случае ваш ответ велик. – Robadob 6 October 2015 в 16:45