Во-первых, DataOutputStream
в вашем втором примере не служит никакой полезной цели1. Действительно, если ваши строки содержат символы, которые не помещаются в 8 бит, метод writeBytes(String)
исказит текст. Избавиться от этого. Потоки данных предназначены для чтения и записи мелкозернистых двоичных данных. Для простых байтов используйте простой (или буферизованный) поток ввода или вывода.
Во-вторых, в этом конкретном случае использования, когда вы записываете весь вывод в виде одной операции записи, BufferedWriter также не добавляет никакого значения.
Так и в этом случае. вы должны сравнивать:
File f = new File("source.htm");
Writer w = new FileWriter(f);
w.write("Content");
против
File f = new File("source.htm");
OutputStream os = new FileOutputStream(f);
os.write("Content".getBytes());
На мой взгляд, первая версия выглядит проще и чище. И лучше всего использовать стеки Reader
и Writer
для текстового ввода-вывода... потому что именно для этого они были разработаны. (Они заботятся о вопросах кодирования и декодирования, чисто и прозрачно.)
Вы можете сравнить их, если вам действительно нужно знать, что быстрее (в вашей системе!), но я подозреваю, что большой разницы нет ... и что первая версия быстрее.
1. Я думаю, что в DataOutputStream скрыта буферизация, но в данном случае буферизация не способствует повышению производительности.
В случаях, когда вы выполняете несколько (небольших) операций записи вместо одной большой, использование BufferedWriter
(или BufferedOutputStream
) вместо небуферизованного модуля записи или потока дает значительное преимущество в производительности.
Другой момент заключается в том, что обе версии вашего кода используют кодировку символов платформы по умолчанию для кодирования выходного файла. Возможно, более целесообразно использовать конкретную кодировку независимо от кодировки по умолчанию или сделать ее параметром конфигурации или командной строки.
person
Stephen C
schedule
03.12.2013